今天看了一篇名为“a bug of fread?”的博客,没找到原因,就贴在这里等高手。
首先,该程序的目的是读取一个文件(readme.txt)并打印内容,我用Visual Studio 2010对其进行了测试。
自述文件的内容是:
1234;
abcd;
ABCD;
自述文件的十六进制值为:
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: 如果用 "rb"调用 fopen 函数,或者如果将宏 BUF_SIZE 定义得更小,我得到了正确的结果。
最佳答案
fread()
不返回以 NUL 结尾的字符串,但 printf("%s")
请求以 NUL 结尾的字符串。
您必须在读取 缓冲区的末尾添加一个'\0':rbuf[rcnt] = '\0'
。
并记住读取比缓冲区大小少一个字节,以便为 NUL 字节留出空间。
关于c - fread 同一个文件,但返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13974182/