2016-10-13 71 views
0

我正在嘗試編寫一個從文件中向後讀取字節的函數。我確切地知道它應該如何工作,但是因爲我剛開始用C++編程,所以我不知道該怎麼做。如何從文件末尾讀取一定數量的字節C++

可以說我有一個2 GB的大文件,我想將最後800 MB分配到系統內存(向後)。我希望它是有效的;沒有加載整個文件,因爲我不需要1.2 GB的它。

到目前爲止,憑藉我有限的知識,我可以寫這個,但我現在被卡住了。當然,如何做到這一點,必須有更優雅的方式。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 

using namespace std; 

int main() { 
    // open the file 
    ifstream file; 
    file.open(filename, ios_base::binary); 

    //check for successful opening 
    if(!file.is_open()){ 
     cout << "Error." << endl; 
     exit(EXIT_FAILURE); 
    } 

    //get the lenght of a file 
    file.seekg (0, file.end); 
    long length = file.tellg(); 
    file.seekg (0, file.beg); 

    //read given amount of bytes from back and allocate them to memory 
    for (long i=0; i<=bytes_to_read-1; i++) { 
     file.seekg(-i, ios::end); 
     file.get(c); 

     //allocation process 

    } 
    return 0; 
} 
+2

爲什麼不先'file.seekg(-bytes_to_read,ios :: end)',讀取'bytes_to_read'字節,然後每天調用它?如果您想顛倒字節的順序,請在讀取它們後將其反轉。 –

+1

@SamVarshavchik說什麼。尋找每個字節的讀取效率極低。這是Windows Update可以做的事情。 –

+0

我認爲可能有辦法如何做到這一點,而不是做額外的步驟(扭轉它在內存中)。我能夠將所有字節加載到引用char數組中,但是因爲只有字符串的反向函數,所以您認爲我應該實現自己的字符串?有沒有辦法解決? – robert

回答

0

使用fseek得到你想要的位置,並從那裏讀取文件。這裏是fp是一個文件指針。

fseek(fp, -10, SEEK_END); // seek to the 10th byte before the end of file 
http://beej.us/guide/bgc/output/html/multipage/fseek.html seekg如果下使用的iostream ++

+0

'fseek()'是一個C函數。問題是要求使用'std :: ifstream'而不是'FILE *'的C++解決方案。 –

0

首先有一個錯誤 - 您需要在循環中尋求-i-1

其次,最好避免這麼多的系統調用。讀取完整緩衝區或一些合理的大小,然後在內存中反轉緩衝區,而不是逐字節讀取。