2016-12-14 14 views
1

バイナリファイルをchar配列にロードしようとしています。私のコードは:私はprogram.exe has stopped workingを受け取るので、私は1Mより大きいものにMAX_FILE_SIZEを設定するまで300MBのバイナリファイルをchar配列に読み込みます

int MAX_FILE_SIZE = 1 000 000 
FILE *f; 
char buffer[MAX_FILE_SIZE]; 
f = fopen("sample.bin", "rb"); //sample.bin is 300MB binary file 
if (f) 
    n = fread(buffer, sizeof(char), MAX_FILE_SIZE, f); 

それは動作します。私がメモリにsample.binをすべてロードすることを考えると、私はMAX_FILE_SIZEを〜300Mに設定するべきです。どうやってやるの?

+4

これはテスト可能な例はありませんが、私はあなたがstackspaceを使い果たし疑い。 – EOF

+5

いくつかのヒープ割り当てメモリ(例えば、 'malloc')を使用します。 –

+0

バッファを静的にしようとしましたか?これは、スタックの代わりにデータセグメント内にスペースを割り当てます。 –

答えて

4

桁のブロックのためのセパレータで多数を定義するためのCの構文はありません:int MAX_FILE_SIZE = 1 000 000int MAX_FILE_SIZE = 1000000;を記述する必要があります。

自動ストレージでローカルオブジェクトとして大きな配列を割り当てると、未定義の動作が発生することがあります。利用可能なスペースの合計はシステムによって異なりますが、1メガバイト未満である可能性があります。私はあなたがmalloc()でバッファを割り当て、使用後にそれを解放勧め:

size_t MAX_FILE_SIZE = 300000000; // 300MB 

int read_file(void) { 
    FILE *f; 
    int n = -1; 
    char *buffer = malloc(MAX_FILE_SIZE); 
    if (buffer == NULL) 
     return -1; 
    f = fopen("sample.bin", "rb"); //sample.bin is 300MB binary file 
    if (f) { 
     n = fread(buffer, sizeof(char), MAX_FILE_SIZE, f); 
     // perform what ever task you want 
     fclose(f); 
    } 
    free(buffer); 
    return n; 
} 
2

プラットフォームやコンパイラによっては、スタック上の許容割り当て(バッファの所在)に制限があります。ファイル全体をメモリにロードする場合は、ヒープを使用する必要があります(mallocを使用する)。だから、代わりに:

char buffer[MAX_FILE_SIZE]; 

使用:

char *buffer; 
if ((buffer = malloc(sizeof(char) * MAX_FILE_SIZE)) == 0) { 
    // exit or some other action to take as your OS failed to allocate 
} 
+0

この正確なコードはうまくいきません。なぜなら、条件が満たされなければ、 'buffer'はすぐにスコープから外れるからです。 – HolyBlackCat

+0

ニースキャッチ。ありがとう。 –

関連する問題