13

1 つの大きなファイル (約 10 GB) のすべてのブロックを順番に読み取る必要があります。ファイルには、次のようにいくつかの文字列を含む多くのフロートが含まれています (各項目は '\n' で分割されています): 6.292611 -1.078219E-266 -2.305673E+065 sod;eiwo 4.899747e-237 1.673940e+089 -4.515213

MAX_NUM_PER_FILE毎回アイテムを読み込んで処理し、別のファイルに書き込んでいますが、いつifstream終了するかわかりません。これが私のコードです:

ifstream file_input(path_input);  //my file is a text file, but i tried  both text and binary mode, both failed.
if(file_input)
{
    file_input.seekg(0,file_input.end);
    unsigned long long length = file_input.tellg();    //get file size
    file_input.seekg(0,file_input.beg);

    char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
    int i=1,j;
    char c,tmp[3];
    while(file_input.tellg()<length)
    {
        file_input.read(buffer,MAX_NUM_PER_FILE);
        j=MAX_NUM_PER_FILE;
        while(file_input.get(c)&&c!='\n')
            buffer[j++]=c;   //get a complete item

        //process with buffer...

        itoa(i++,tmp,10);    //int2char
        string out_name="out"+string(tmp)+".txt";
        ofstream file_output(out_name);
        file_output.write(buffer,j);
        file_output.close();
    }

    file_input.close();
    delete[] buffer;
}

コードがうまくlengthいかず、実際のファイル サイズよりも大きくなっています。file_input.good()またはを試してみ!file_input.eof()ましたが、機能しませんでした。getline(file_input,s)良いですが、よりもはるかに遅いです。read必要ですが、ファイルの終わりreadかどうかを確認する方法がわかりません。ifstream

私はVS2010を使用してWINDOWS 7で作業を行っています。

私は検索しましたが、それについての答えはありません.ifstreamを使用してファイルを開き、最後まで読み続ける方法このリンクは私の質問に答えることができません.


アップデート、問題解決

皆さん、こんにちは。私のせいだとわかりました。両方ともwhile(file_input.tellg()<length)うまくwhile(file_input.peek()!=EOF)いきます!while(file_input.peek()!=EOF)がおすすめ。

end-of-file の後に追加で書き込まれる項目はbuffer、最後に書き込まれた残りの項目です。

正しいコードは次のとおりです。

ifstream file_input(path_input);
if(file_input)
{
    //file_input.seekg(0,file_input.end);
    //unsigned long long length = file_input.tellg();   //get file size
    //file_input.seekg(0,file_input.beg);

    char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
    int i=1,j;
    char c,tmp[3];
    while(file_input.peek()!=EOF)
    {
        memset(buffer,0,sizeof(char)*(MAX_NUM_PER_FILE+MAX_NUM_PER_LINE));  //clear first!
        file_input.read(buffer,MAX_NUM_PER_FILE);
        j=MAX_NUM_PER_FILE;
        while(file_input.get(c)&&c!='\n')
            buffer[j++]=c;

        itoa(i++,tmp,10);//int2char
        string out_name="out"+string(tmp)+".txt";
        ofstream file_output(out_name);
        file_output.write(buffer,strlen(buffer));   //use the correct buffer size instead of j
        file_output.close();
    }

    file_input.close();
    delete[] buffer;
}
4

1 に答える 1