バグ : ファイルを開く

Posted: 2011年08月30日

ファイルを開くプログラムでよく書いてしまうバグを紹介します。

プログラムプログラム:

 #include <fstream>

 int main(int argc, char *argv[])
 {
    std::ofstream ostream(argv[1]);

    //
    // 書き込み処理
    //

    ostream.close();

    return 0;
 }

このプログラムにどのようなファイル操作関連のバグがあると思いますか?

  • ファイルが開けなかったことを想定していない
  • 追記する処理だったのに追記モードで開いていない
  • ファイルが既に存在している場合は、以前の内容を全て削除して開く予定が上書きモードで開かれる
  • バイナリーモードで開く予定だったがテキストモードで開いている
  • ファイルを開いている間に、他プロセスからも編集が可能(ファイルロックしていない)

改善版プログラム改善版プログラム:

 #include <fstream>

 int main(int argc, char *argv[])
 {
    // 以前のデータを削除して開く
    std::ofstream ostream(argv[1], std::ios::out | std::ios::trunc);
    if (ostream.fail() == true) {
        // ファイルのオープンに失敗
        return -1;
    }

    //
    // 書き込み処理
    //

    ostream.close();

    return 0;
 }

コンストラクタに渡しているオプションの説明
cplusplus.com
http://www.cplusplus.com/reference/iostream/ofstream/ofstream/

ファイルロックするには、fstreamクラスを使用するやり方では実現ができないため
実現するには、以下の方法しかないと思われる

  • CreateFile+LockFile
  • fopen+flock

調査不足感がかなりあるので知っている方教えて下さい。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント