c - fread 同一个文件,但返回不同的结果

标签 c windows fread

今天看了一篇名为“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/

相关文章:

c - 为什么2个输出不同?

android - 在 Windows Linux 子系统上,Android SDK 目录不存在

windows - 如何防止使用命令 echo 在文本输出中显示 echo 命令行本身?

c - c 中的 fread 读取的内容超出了指示的内容

r - 使用fread导入csv时出现“字符串中嵌入nul”错误

c - 始终初始化所有变量

C - 创建文件时使用 "w+"模式

php - 如何在 php 中打开 ssrs rdl 文件

r - 在 "."中的 `fread` 中使用 sep = "data.table"

c - 以下代码总是卡住并且窗口挂起