【问题标题】:what this error description means in fread()此错误描述在 fread() 中的含义
【发布时间】:2018-04-19 10:12:51
【问题描述】:

我正在 Ubuntu 上学习 fopen(),这是我的代码。你能帮忙看看具体的失败原因是什么?

交流

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main() {
    char reg_filename[] = "/home/chuck/Documents/enable";
    FILE* f;
    char val[2];

    f = fopen(reg_filename, "r");
    if (f == NULL) {
        perror(reg_filename);
        printf("error\n");
        return 1;
    }
    setvbuf(f, (char *)NULL, _IONBF, 0);
    if (fread(&val, sizeof(val), 1, f) == 0) {
        perror(reg_filename);
        printf("Read_error\n");
        return 1;
        }
    return 0;
}

构建并运行它...

chuck@ubuntu:~/Documents$ gcc a.c
chuck@ubuntu:~/Documents$ ./a.out
/home/chuck/Documents/enable: Success
Read_error

在代码中,“启用”是我系统中的一个文件。 我所知道的是它在 fread() 上失败,因为“Read_error”弹出。但是这个“成功”是什么意思呢?如果失败,为什么会给出“成功”字样?

关于如何使用 fread(),我是全新的......这个 fread() 将从 f(文件路径)读取长度为 val[] 的大小并读取到 val[],对吗?

它是否与 val[] 的大小有关,在这种情况下,我只是把它放在 2 那么 sizeof(val) 应该是 3?那么 fread 将如何将 f (/home/chuck/Documents/enable) 读入其中呢?

【问题讨论】:

  • 在命令行中输入man fread。另外,请注意您在数组上使用运算符的&amp; 地址,这不是必需的,实际上它是完全错误的,因为即使两个基地址相同arr + 1&amp;arr + 1 不同。
  • 除了前面的评论:你知道enable 文件是空的吗?这就是 fread 返回 0 的原因,因为它返回读取的项目数,在这种情况下为 0。
  • 哦,是的,我的启用是空的。我真是个傻瓜……只需在启用文件中输入一些文字,它就可以正常工作。

标签: c ubuntu fread


【解决方案1】:

阅读 fread 的手册页

size_t fread(void *ptr, size_t size, size_t nmembFILE *" stream );

它明确指出,

函数 fread() 读取 nmemb 项数据,每个 size 字节长, 从流指向的流中,将它们存储在该位置 由ptr给出。

重要的是,你可能想要改变

fread(&val, sizeof(val), 1, f)

fread(val, sizeof(val), 1, f)

因此,如果您的 enable 文件可能为空,它将返回 0

【讨论】:

    【解决方案2】:

    如果您读取的计数较短(即比您预期的要少),那么 fread() 要么遇到错误,要么在读取足够的字节之前到达文件末尾。

    在您的情况下,您读取了 0 个项目而不是 1 个项目,因此在读取整个项目之前出现错误或文件结尾。使用feof() 或 ferror() 来确定您是否有文件结尾或错误。即如果ferror() 返回非零,则存在错误并且errno 是有意义的。

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多