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で終端でないかどうかのチェックも一緒にしなければエラーが発生したのかどうかがわかりません。

ややこしいですね。