0

このコードを使用すると

FILE *f = fopen(file, "rb");
const char *d;
if (f!=NULL) {
    static char c[100000];
    fread(c, sizeof(char), 10000000, f);
    d = c;
    fclose(f);
    return d;
}
else{
    /*
     char *ff = f;
     perror(ff);
     */
    d = "Error";
    fclose(f);
    return d;
}

このようなテキストを含むファイルから読み取る

This
Is a test

それはそれをうまく読みます。ただし、このテキストを含む別のファイルを開くと

Test

それは次のように読みます

Test Is a test

ファイルを閉じたときに両方を 1 つに結合するのはなぜですか? これを入れましたが、それでも同じ結果が得られます

if (f!=NULL) {
fread(c, sizeof(c), len, f);
d = c;
fclose(f);
c[99999] = '\0';
return d;
}
4

3 に答える 3

4

fread()読み込み先のバッファを NUL で終了しません。2 番目の読み取りが最初の読み取りよりも短い場合、上書きされていない最初の読み取りの残りはそこに残ります。とにかく、あなたのプログラムはあまりにも多くの場所で未定義の動作を呼び出しますが、それは面白くありません。

たとえば、次のようになります。

static char c[100000];
fread(c, sizeof(char), 10000000, f);

ほとんどの場合、タイプミスですfread()。バッファのサイズの 100 倍のデータを読み取ることを許可しています。そのため、常に(つまり、ALWAYS )sizeof()演算子と、配列要素の型ではなくサイズを使用する必要があります。また、sizeof(char)常に 1 です。冗長なデータを綴らないでください。

fread(c, sizeof(c), 1, f);
于 2013-03-18T22:01:22.620 に答える
4

最後の読み取りから配列に文字が残っているようです。戻る前に文字列を null で終了する必要fread()があります。これは行いません。

fread()バッファサイズよりもはるかに大きい文字制限など、他にもいくつかの問題があります。

これに c が本当に必要でない限り、c++ や、より洗練されたファイルおよびテキスト処理ライブラリを備えた他の言語を使用することを検討する必要があります。そうすれば、作業が楽になります。

于 2013-03-18T22:01:34.613 に答える
2

データを静的バッファーに読み込んでおり、完了しても文字列を終了しません。cは静的であるため、ゼロ初期化されます。呼び出しからのデータで部分的に上書きしfread()ます。

したがって、 からの戻り値を使用し、 にfread()設定c[len]する必要があり'\0'ます。

于 2013-03-18T22:02:49.717 に答える