今日、「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 を小さく定義すると、正しい結果が得られました。