これは通常、ファイルの終わりを誤ってテストした結果です。通常、次のようなことをしたいと思います。
while (infile>>variable) ...
また:
while (std::getline(infile, whatever)) ...
だがしかし:
while (infile.good()) ...
また:
while (!infile.eof()) ...
最初の2つは読み取りを行い、失敗したかどうかを確認し、失敗した場合はループを終了します。後者の2つは読み取りを試み、変数にあるものを処理し、前の試みが失敗した場合は次の反復でループを終了します。最後の反復では、読み取りに失敗した後の変数の内容は通常、以前の内容であるため、2番目の2つのループのいずれかのようなループは、通常、ファイルの最後の項目を2回処理するように見えます。
あるファイルを別のファイルに簡単にコピーするには、次のようなものを使用することを検討してください。
// open the files:
ifstream readfile(inputFile);
ofstream writefile(outputFile);
// do the copy:
writefile << readfile.rdbuf();
これは小さなファイルではうまく機能しますが、大きなファイルでは大幅に遅くなる可能性があります。このような場合、通常、read
1つのファイルから別のファイルにingするループを使用する必要がありますwrite
。これには、微妙なエラーの可能性もあります。テストされ、一般的に適切に機能する1つの方法は、次のようになります。
std::ifstream input(in_filename, std::ios::binary);
std::ofstream output(out_filename, std::ios::binary);
const size_t buffer_size = 512 * 1024;
char buffer[buffer_size];
std::size_t read_size;
while (input.read(buffer, buffer_size), (read_size = input.gcount()) > 0)
output.write(buffer, input.gcount());