日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)

發布時間:2025/3/15 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++中从文件末尾反向读取N行文件记录(末尾读取文件) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在實際的開發項目遇到了一個問題,有個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 ) {cerr<<"打開日志文件失敗!";return -1; }// 先倒回文件末尾兩個字符 fin.seekg(-2, fin.cur); // 假定反向讀取100行記錄 int lineCount = 100; for(int i = 0; i < lineCount; i++) { // 查看前一個字符是否為回車符while( fin.peek() != fin.widen('\n') ){fin.seekg(-1, fin.cur );}// 走到這里表示跳過一行了,所以繼續跳直到夠100行fin.seekg(-1, fin.cur); }fin.seekg(2, fin.cur); // 現在文件指針指向99行的末尾,可以讀取了 vector<string> result; std::string line; while( getline(fin, line) ) {//cout <<"新入一行 : "; << line << endl;result.push_back( line ); } fin.clear(); fin.close();

?

總結

以上是生活随笔為你收集整理的C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。