讀取10GB二進制文件並解析每個字節而不使用boost庫的最簡單方法是什麼?迭代10GB +二進制文件
及其與流如此混亂,文件,內存映射文件等
我真的只是想是這樣的:
char* buffer = read(filename, binary);
while(buffer != EOF){
//Read byte
++buffer;
}
性能此事確實只是由於文件大小。
讀取10GB二進制文件並解析每個字節而不使用boost庫的最簡單方法是什麼?迭代10GB +二進制文件
及其與流如此混亂,文件,內存映射文件等
我真的只是想是這樣的:
char* buffer = read(filename, binary);
while(buffer != EOF){
//Read byte
++buffer;
}
性能此事確實只是由於文件大小。
結束),使用fread()
。您可以在std::shared_ptr
的FILE*
存儲RAII:
std::shared_ptr<FILE> file(fopen(...), fclose);
可以忽略C++流,內存映射文件,升壓,等等這些都不將比fread()
更快。
*「這些都不會比fread()快」* - 我們需要這種[ipsedixitism]的證據(https://en.wikipedia.org/wiki/Ipse_dixit)。有一些數字來支持你的陳述? – WhiZTiM
@WhiZTiM:我已經多次測試過這些東西。任何想在自己的特定平臺上100%確定自己特定用例的人都歡迎編寫自己的基準測試。 –
當你不關心性能,
一個簡單的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;
}
}
當然,您一次不會讀取一個10 GB的輸入文件。 –
@JohnZwinck爲什麼不呢?爲你做的實際I/O的代碼知道得更好,並且會根據需要讀取有效大小的塊,除非你明確地告訴它不這樣做。我可以想象大量的應用程序需要逐字節讀取。 –
@CareyGregory沒有人會「要求」它。 – xaxxon
std :: ifstream有什麼問題? –
對於簡單的塊我總是回到C和無緩衝FILE *處理。 – Lothar
內存映射文件是最好的。 – Jichao