fstreamクラスでファイルのコピー処理
ロベールのC++入門講座 08-09
ファイルのコピーを実装します。
#include <iostream> #include <fstream> using std::cout; using std::endl; int main () { std::fstream file1; std::fstream file2; char buf[16]; file1.open("main.cpp",std::ios::in|std::ios::binary); if ( !file1.is_open() ) { cout << "read file open error" << endl; return EXIT_FAILURE; } file2.open("out.txt",std::ios::out|std::ios::binary); if ( !file2.is_open() ) { cout << "write file open error" << endl; file1.close(); return EXIT_FAILURE; } while( !file1.eof() ) { file1.read(buf,sizeof(buf)); // ファイルの終端ではなくエラーが出たらとりあえず抜ける if ( file1.fail() && !file1.eof() ) { break; } file2.write(buf,file1.gcount()); } file1.close(); file2.close(); return 0; }
C言語に比べて、やはりクラスを使うと処理がスッキリ見えますね。
注意点は一箇所。file1.fail()の呼び出しの部分です。failはエラーが発生した場合か、ファイルの終端に来た場合に真になるのでfailだけでやってしまうとファイルの終端でもbreakが走ってしまいます。
なのでeofで終端でないかどうかのチェックも一緒にしなければエラーが発生したのかどうかがわかりません。
ややこしいですね。