2016-09-24 90 views
2

讀取10GB二進制文件並解析每個字節而不使用boost庫的最簡單方法是什麼?迭代10GB +二進制文件

及其與流如此混亂,文件,內存映射文件等

我真的只是想是這樣的:

char* buffer = read(filename, binary); 

while(buffer != EOF){ 
    //Read byte 
    ++buffer; 
} 

性能此事確實只是由於文件大小。

+0

std :: ifstream有什麼問題? –

+0

對於簡單的塊我總是回到C和無緩衝FILE *處理。 – Lothar

+2

內存映射文件是最好的。 – Jichao

回答

1

結束),使用fread()。您可以在std::shared_ptrFILE*存儲RAII:

std::shared_ptr<FILE> file(fopen(...), fclose); 

可以忽略C++流,內存映射文件,升壓,等等這些都不將比fread()更快。

+7

*「這些都不會比fread()快」* - 我們需要這種[ipsedixitism]的證據(https://en.wikipedia.org/wiki/Ipse_dixit)。有一些數字來支持你的陳述? – WhiZTiM

+1

@WhiZTiM:我已經多次測試過這些東西。任何想在自己的特定平臺上100%確定自己特定用例的人都歡迎編寫自己的基準測試。 –

0

當你不關心性能,
一個簡單的while循環與ifstream可以一次提取一個字節:如果你想表現好順序訪問(從一開始就向着讀取

#include <iostream> 
#include <fstream> 

int main(){ 

    std::ifstream infile("file.txt"); 

    while (infile){ 

    //get next byte 
    char c; 
    infile.get(c); 

    //process byte 
    std::cout << c; 
    } 

} 
+1

當然,您一次不會讀取一個10 GB的輸入文件。 –

+0

@JohnZwinck爲什麼不呢?爲你做的實際I/O的代碼知道得更好,並且會根據需要讀取有效大小的塊,除非你明確地告訴它不這樣做。我可以想象大量的應用程序需要逐字節讀取。 –

+1

@CareyGregory沒有人會「要求」它。 – xaxxon