2011-11-25 5 views
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 
} 

を私はしばらくとしてifstream.eof()を使用することによって、これを達成しようとしましたしかし、私はこれが行く方法ではないと聞いてきました。私はstd :: ios :: ifstreamの他の関数を見てきましたが、他に何を使うべきか分かりません。

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

答えて

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<<を定義することです。

+0

非常に大きなファイルを読み込んでそれを他のファイルに書き出す必要がある場合は、バッファの使用について心配する必要はありません.iostreamはこれを既に実行していますか?しかし、後の段階でTCPを介してデータを送信しているため、私はそれを行っています。コードをありがとう、私は今それを試してみましょう。 – codd

+0

コードは動作します!ありがとう! – codd

+0

他の注意点:これは、テキスト以外のファイルを扱う場合にも有効ですか?私はどのような種類のファイル(pdf、mp3、...)でもこれを実行できる必要があるからです。そして、私はそれをテストしたpdfで動作しないようです。 – codd

0

あなたのロジックは単に間違っています。

あなたはもっとこのようにそれについて移動する必要があり

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

それがさらに簡単であるかを参照してください? 「ファイルの終わり」を明示的にチェックする必要はなく、失敗するまでデータを読み取るだけです。その後、あなたは完了です。あなたがループ内のライトがあまりにも失敗しないことを確認したい場合があります

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 
} 

+0

私はあなたが何を意味するかを見ます。私は条件としてread()を使うことでそれを達成しようとしましたが、read()は空のファイルを与え、read()はファイルをコピーの間にゴミで書き直しました。私は具体的な機能を具体化して教えてもらえますか? – codd

6

istream::read機能は、あなたのような何かを行うことができますので、ブール式として使用できるストリームを返します。

+0

次のコードで空の新しいファイルが作成されましたが、おそらくあなたはその問題が何であるか知っていますか? 'while(is.read(バッファ、BUFLEN)){outfile.write(バッファ、BUFLEN); } ' – codd

+0

@coddサンプルコードを拡張しました。それを自分で試してみた。 –

+0

サンプルコードJoachimをありがとう。これはpdfのような他のファイルでも動作するようです! – codd

関連する問題