私のコードでは、あるファイルから別のファイルにデータをコピーする必要がある状況があります。解決策は、私はこのようなルックスを思い付いた:C/C++のあるファイルから別のファイルにデータをコピーする最速の方法は?
const int BUF_SIZE = 1024;
char buf[BUF_SIZE];
int left_to_copy = toCopy;
while(left_to_copy > BUF_SIZE)
{
fread(buf, BUF_SIZE, 1, fin);
fwrite(buf, BUF_SIZE, 1, fout);
left_to_copy -= BUF_SIZE;
}
fread(buf, left_to_copy, 1, fin);
fwrite(buf, left_to_copy, 1, fout);
私の主な考えはmemcpyのようなものがあるかもしれないということでしたが、ファイル内のデータのために。私はそれに2つのファイルストリームと合計バイト数を与えます。私は少し捜したが、私はそのようなものを見つけることができなかった。
しかし、そのようなものが利用できない場合は、転送を最も速くするためにどのバッファサイズを使用する必要がありますか?システムコールの数が増えれば増えるだろうが、システム上の他のバッファリングやキャッシングを混乱させる可能性があると私は考えた。バッファを動的に割り当てて、読み込み/書き込み呼び出しのペアだけを取る必要がありますか?この場合の典型的な転送サイズは、数KBから数十MB程度です。
EDIT:OS固有の情報については、Linuxを使用しています。
EDIT2:
私はsendfileの使用してみましたが、それはうまくいきませんでした。それは正しい量のデータを書くように思えましたが、それはごみでした。
私はこのようなもので、上記の私の例を置き換える:
fflush(fin);
fflush(fout);
off_t offset = ftello64(fin);
sendfile(fileno(fout), fileno(fin), &offset, toCopy);
fseeko64(fin, offset, SEEK_SET);
私はフラッシュ、offest、それが動作するようには見えなかったので、一度に一つを求めてを追加しました。
これを実行する最速の方法は、OSに依存するAPIを使用することになりそうです。 – Lalaland
単純なifstream iの何が問題なのですか? ofstream o;/*両方を開く* /; o << i.rdbuf(); '?保証された移植性は無視するものではありません... – ildjarn
fread()とfwrite()には戻り値があります。それらをチェック/使用する必要があります。 – Ras