バグ:大きいサイズのファイルを読み込むとエラーになる

Posted: 2013年07月29日

ファイルの読み込み処理プログラムで書いてしまうバグを紹介します。

プログラムプログラム:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
     FILE *fp;
     fp = fopen(argv[1],"r");
     if (fp == NULL) {
        // ファイルが開けない
        return 1;
     }

     // ファイルの最後の位置へ移動しファイルサイズを取得
     fseek(fp, 0, SEEK_END);
     long nFileSize = ftell(fp);

     // 先頭から読み込むため移動
     fseek(fp, 0, SEEK_SET);

     char *pFileData = new char[nFileSize];
     fread(pFileData, sizeof(char), nFileSize, fp);

    // 処理

     delete[] pFileData;

    return 0;
 }

このプログラムにどのようにファイルの読み込み処理にバグが存在すると思いますか?

  • この使用方法では、ファイルサイズが大きい場合メモリーの確保が出来ないためエラーになる

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

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
     FILE *fp;
     fp = fopen(argv[1],"r");
     if (fp == NULL) {
        // ファイルが開けない
        return 1;
     }

     char pBuffer[4096];
     while (fread(pBuffer, sizeof(char), sizeof(pBuffer), fp) {
        // 処理
    }

    return 0;
 }

解説解説:

小さいファイルしか処理しない場合は問題ないですが
大きいファイルになるととたんに問題になります。

バッファーを用意することで
使用するメモリーを制限し処理をします。

このような処理が出来ない場合もあるとは思いますが
通常の場合はこういったことはやめたほうがいいという事で

C言語の場合は、
わざわざファイルサイズを計算したりと面倒ですが。

他の言語では一括で読み込む関数が用意されているため
覚悟して使用する必要があります。

PHPの場合
file_get_contents

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

コメント