C 中從檔案末尾反向讀取N行檔案記錄。

2021-09-12 19:40:23 字數 1177 閱讀 7068

最近在實際的開發專案遇到了乙個問題,有個24小時在跑的linux程式,會不斷有日誌輸出,寫到乙個指定的日誌檔案中。但是,日誌只提供了輸出的功能,並沒有讀取日誌檔案的功能。如果給程式設計師自己看日誌是很簡單的,只需要用tail 或 vi 即可。但是現在有個需求,需要在程式的介面上顯示日誌檔案的內容,而且是最近的100行記錄。在網上搜尋了一遍,總結一下:

1:從檔案頭開始,先用getline函式獲取每一行,然後再丟棄前面的資料。

我:不行,日誌檔案有可能幾百mb,全部讀一篇再丟棄是行不通的。

2:自己先計算文字有多少行,然後再擷取。

我:沒有找到具體的實現**,而且我正在讀取這個檔案時有可能程式正在輸出日誌,不能隨意破壞檔案的輸出。

最終沒找到合適解決方案,我自己的思路是這樣的:

1:開啟檔案

2:將檔案指標移到最後。

3:反向搜尋換行符,如果達到100行則停止搜尋了。

4:根據當前位置再將一行行記錄讀取放到vector裡。

5:現在可以將vector裡的記錄進行處理。

實現後發現反向讀取100的內容還是很快的,0.1毫秒都不用,當然,這要看一行的內容有多少。

而且**中並不真正去讀取字元,只是用c++的io輸入流中的peek函式檢視資料,效率提高了。

**如下:

--------------------- 

std::ifstream  fin( "/var/log/test.log" , std::ios::ate );

if( !fin )

// 先倒回檔案末尾兩個字元

fin.seekg(-2, fin.cur);

// 假定反向讀取100行記錄

int linecount = 100;

for(int i = 0; i < linecount; i++)

// 走到這裡表示跳過一行了,所以繼續跳直到夠100行

fin.seekg(-1, fin.cur);}

fin.seekg(2, fin.cur);

// 現在檔案指標指向99行的末尾,可以讀取了

vectorresult;

std::string line;

while( getline(fin, line) )

fin.clear();

fin.close();

C 從磁碟中讀取檔案

讀取txt檔案 讀取的資料比較小的時候 如果你要讀取的檔案內容不是很多,可以使用 file.readalltext filepath 或指定編碼方式 file.readalltext filepath,encoding 的方法。它們都一次性將文字內容全部讀完,並返回乙個包含全部文字內容的字串 用st...

WIndows下 C 從檔案中讀取資料

背景 windows下利用c 從檔案中讀寫內容 1 使用fscanf語句 include include std file fp fp fopen filepath.c str r if fp std mapnonamemap fscanf fp,s,s,s a,b,c printf s s s n...

從XML檔案中讀取資料

using system using system.data using system.configuration using system.web using system.web.security using system.web.ui using system.web.ui.webcontro...