1

今日、「a bug of fread?」という名前のブログを読みましたが、理由が見つからなかったので、天才を待ってここに貼り付けます。

まず、プログラムの目的は、ファイル (readme.txt) を読み取って内容を印刷することであり、Visual Studio 2010 でテストします。

readme の内容は次のとおりです。

1234;
abcd;
ABCD;

readme の 16 進値は次のとおりです。

31 32 33 34 3b 0d 0a 61 62 63 64 3b 0d 0a 41 42 43 44 3b

コードは次のとおりです。

#include <stdio.h>
#include <string.h>

#define BUF_SIZE 1024

int main()
{
    FILE *fp = NULL;
    int rcnt = 0;

    char rbuf[BUF_SIZE];

    fp = fopen("readme.txt", "r");
    if (NULL == fp)
    {
        printf("fopen error.\n");
        return -1;
    }

    printf("--------------------------\n");
    memset(rbuf, 0, BUF_SIZE);
    fseek(fp, 0, SEEK_SET);
    rcnt = fread(rbuf, 1, BUF_SIZE, fp);
    printf("read cnt = %d\n", rcnt);
    printf("%s\n", rbuf);

    return 0;
}

このような単純なコードで、期待される結果は次のとおりです。

--------------------------
read cnt = 17
1234;
abcd;
ABCD;

合計 17 カウントには、15 文字と 2 つの '\n' が含まれます。
しかし、私は以下の結果を得ました:

--------------------------
read cnt = 17
1234;
abcd;
ABCD;D;

PS: fopen 関数を "rb" で呼び出すか、マクロ BUF_SIZE を小さく定義すると、正しい結果が得られました。

4

2 に答える 2

1

fread()NUL で終了する文字列を返しませんが、NUL で終了する文字列をprintf("%s")要求します。

読み取りバッファの末尾に「\0」を追加する必要があります: rbuf[rcnt] = '\0'. また、NUL バイトの余地を残すために、バッファ サイズよりも 1 バイト少なく読み取ることを忘れないでください。

于 2012-12-20T14:34:29.963 に答える