幾種獲取檔案有多少行的方法
使用c++中的ifstream 與 getline函式搭配使用 如:
std::string file_name = "f:\\phone_num_10000000.txt";
std::ifstream ifs(file_name.c_str());
int line_count = 0; ///記錄檔案中行的數量
std::string tmp_content; ///臨時儲存行資料
while (!ifs.eof())
std::cout << "line_count = "
<< line_count << std::endl;
以上想法是最先想到的,執行上面的程式,使用clock()函式計數,處理10000000行條資料大概用了3500左右的cpu時鐘週期
經過每條語句的跟著,發現時間基本上全用在呼叫std::getline函式用了上了。出現這種原因,是頻繁的io操作,而io操作都很昂貴。
針對上面的原因,時間主要用在io操作上,我們可以減少io操作,以達到提供效能,改進的方法**如下:
std::string file_name = "f:\\phone_num_10000000.txt";
struct stat s;
stat(file_name.c_str(), &s);
///獲取指定文字的行數
std::string file_buf(s.st_size + 1, '\0');
///將檔案中的資料一次性讀出來
std::ifstream ifs(file_name.c_str());
ifs.read(&file_buf[0],
file_buf.size());
int line_count = 0; ///記錄檔案中行的數量
const
char* file_buf_tmp = file_buf.c_str(); ///獲取檔案內容指標
while (*file_buf_tmp != '\0')
///過濾空行
line_count += p - file_buf_tmp > 0;
///查詢下乙個'\n'
file_buf_tmp += p - file_buf_tmp + 1; }
std::cout << "line_count = "
<< line_count << std::endl;
經過下面改進的**,測試中時間縮短到800左右的cpu時鐘週期,單獨測試上面那個while迴圈,只是用了200左右的時鐘週期,也就是說讀檔案到快取用了將近
600左右時鐘週期,邏輯處理效能已經很好了, 那還能不能優化io操作效能呢,我們嘗試著將c++讀取檔案修改c語言讀取檔案試試,具體**如下:
std::string file_name = "f:\\phone_num_10000000.txt";
struct stat s;
stat(file_name.c_str(), &s);
///獲取指定文字的行數
std::string file_buf(s.st_size + 1, '\0');
///將檔案中的資料一次性讀出來
file* fp = fopen(file_name.c_str(), "rb");
fread(&file_buf[0], sizeof(char), file_buf.size(), fp);
int line_count = 0; ///記錄檔案中行的數量
const
char* file_buf_tmp = file_buf.c_str(); ///獲取檔案內容指標
while (*file_buf_tmp != '\0')
///過濾空行
line_count += p - file_buf_tmp > 0;
///查詢下乙個'\n'
file_buf_tmp += p - file_buf_tmp + 1; }
std::cout << "line_count = "
<< line_count << std::endl;
經過測試,目前處理只需要500左右的時間週期,改用c語言讀取檔案比起c++讀取資料效能提高了將近一半。
Python如何獲取檔案指定行的內容
linecache,可以用它方便地獲取某一檔案某一行的內容。而且它也被 trxjkzenlaceback 模組用來獲取相關原始碼資訊來展示。用法很簡單 import linecache linecache.getline etc passwd 4 sys x 3 3 sys dev bin sh n...
C C 獲取檔案大小(長度)的方法
c 如何得到檔案的大小 先用fopen開啟檔案,然後把檔案指標指向檔案尾.再用ftell獲得檔案指標當前位置 即檔案長度 源 include stdafx.h include include using namespace std int main fseek fp,0,seek end 定位到檔案...
C C 獲取目錄下的檔案列表資訊
在c c 程式設計時,需要獲取目錄下面的檔案列表資訊。1.資料結構 struct dirent struct dirstream typedef struct dirstream dir 2.程式示例 其中程式中win不支援檔案型別 d type 可以根據檔名稱字尾來判斷檔案型別 linux可以直接...