2016-10-13 6 views
0

バイトをファイルから逆方向に読み込む関数を記述しようとしています。私はそれがどのように動作すべきかを正確に知っていますが、C++でプログラミングを始めたばかりなので、どうやってそれを行うのか分かりません。ファイルの末尾から一定量のバイトを読み込む方法C++

私は2GBの大きなファイルがあり、最後の800MBをシステムメモリに(後方に)割り当てたいとします。私はそれが効率的であることを望みます。私は1.2GBのファイルを必要としないので、ファイル全体をロードしないでください。

これまで私の限られた知識で私はこれを書くことができましたが、今は固執しています。確かにそれを行う方法をよりエレガントにする必要があります。

#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日と呼びますか?バイトの順序を逆にする場合は、読み込んだ後に逆にします。 –

+1

@SamVarshavchikは言った。各バイトの読み取りを求めることは、極端な非効率性である。それはWindows Updateができるものです。 –

+0

私は、その余分なステップ(メモリ内での逆転)をしないとそのことをどうやって行うのかという方法があると思いました。私はすべてのバイトを参照char配列にロードすることができましたが、文字列の逆関数しかないので、自分で実装するべきだと思いますか?周りに道がありますか? – robert

答えて

0

fseekを使用して、そこからファイルを読み取ります。 fpはファイルポインタです。 http://beej.us/guide/bgc/output/html/multipage/fseek.htmlから

fseek(fp, -10, SEEK_END); // seek to the 10th byte before the end of file 

又はseekg C++でのiostreamを使用している場合。

+0

'fseek()'はCの関数です。問題は 'F​​ILE * 'の代わりに' std :: ifstream'を使ってC++の解決策を求めています。 –

0

最初にバグがあります。ループ内で-i-1に移動する必要があります。

第2に、あまりにも多くのシステムコールを避けるほうがよいです。バイトごとに読み込む代わりに、フルバッファまたは適度なサイズを読み込み、メモリ内のバッファを反転させます。

関連する問題