最近在實際的開發專案遇到了乙個問題,有個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...