5

私はこのようなことを達成しようとしています:

while (ifstream has not been entirely read)
{
   read a chunk of data into a buffer that has size BUFLEN
   write this buffer to ostream
}

最初はwhile条件を使ってこれを達成しようとしifstream.eof()ましたが、これは道のりではないと聞いています。私はstd::ios :: ifstreamの他の関数を見てきましたが、他に何を使うべきか理解できません。

PS:転送されるファイルが非常に大きくなる可能性があるため、バッファを使用しています。

4

3 に答える 3

7

iostreamクラスは必要なすべてのバッファリングを処理するため、必要はありません。ファイル全体をコピーする通常のイディオムは次のとおりです。

fout << fin.rdbuf();

iostreamは、必要なすべてのバッファリングを処理します。<<(これは、フォーマットされないため、やや珍しい使用法です。歴史的な理由は間違いありません。)

ループが必要な場合、おそらくデータを書き換える前にデータに対していくつかの変換を実行したい場合はistream::read、要求された文字数を読み取らない限り「失敗」するため、少し注意が必要です。このため、読み取られた文字数も確認し、読み取りに失敗した場合でも処理する必要があります。

int readCount;
while ( fin.read( &buf[0], buf.size() )
        || (readCount = fin.gcount()) != 0 ) {
    //  ...
    fout.write( &buf[0], readCount );
}

これはかなり醜いです。より良い解決策は、バッファをクラスでラップし、operator<<このクラスのを定義することです。

于 2011-11-25T13:32:28.697 に答える
6

このistream::read関数は、ブール式として使用できるストリームを返すため、次のようなことができます。

while (is.read(buffer, BUFLEN))
{
    outputfile.write(buffer, is.gcount());
}

if (is.eof())
{
    if (is.gcount() > 0)
    {
        // Still a few bytes left to write
        outputfile.write(buffer, is.gcount());
    }
}
else if (is.bad())
{
    // Error reading
}

ループ内の書き込みも失敗しないことを確認することをお勧めします。

于 2011-11-25T13:20:58.040 に答える
0

あなたの論理は単に間違っています。

あなたはそれについてもっとこのように取り組む必要があります:

while (a chunk larger than zero could be read)
{
  write chunk to output
}

それがさらに簡単であることがわかりますか?「ファイルの終わり」を明示的にチェックする必要はありません。失敗するまでデータを読み取るだけです。その後、完了です。

于 2011-11-25T13:18:10.010 に答える