【问题标题】:Using fread on Linux is returning 0在 Linux 上使用 fread 返回 0
【发布时间】:2021-10-28 04:08:13
【问题描述】:

我已经编写了下面的代码,但是我从 fread 返回 0。 perror 返回成功,所以我猜它工作正常。但我不明白为什么我没有读取写入文件的数据。

int main(int argc, char **argv)
{
    FILE *fp;
    char wr_buf[4096];
    char rd_buf[4096];
    int i;
    size_t num;

    printf("v1\n");

    fp = fopen("/run/media/nvme/test", "w+");

    if (fp == NULL)
        {
        printf("FAIL\n");
        return -1;
    }

    for (i=0; i<4096; i++)
    {
        wr_buf[i] = i;
        rd_buf[i] = 0;
    }

    num = fwrite(wr_buf , 1 , sizeof(wr_buf) , fp);
    printf("WR num %d\n", num);

    num = fread(rd_buf , 1 , sizeof(rd_buf) , fp);
    printf("RD num %d\n", num);
    perror("fread");

    for (i=0; i<4096; i++)
    {
        if (wr_buf[i] != rd_buf[i])
        {
            printf("ERR %x != %x\n", wr_buf[i], rd_buf[i]);
        }
    }   

    fclose(fp);

    printf("DONE\n");

        return 0;
}

【问题讨论】:

  • fwrite 推进文件位置,所以当你 fread 它指向文件末尾时。如果你想读回你刚刚写的数据,你必须fseek回到你数据的开头。
  • 是的,我刚刚意识到它会在文件的末尾。谢谢
  • 另外,fwrite 可能实际上不会写任何东西。您需要 fsync 或 fclose 文件以确保数据实际写入文件。 (不过,如果您在同一进程中查找和读取,则不需要刷新。)
  • 谢谢,我会这样做的

标签: linux fopen fread


【解决方案1】:

在 fwrite 和 fread 之间调用 rewind(fp); 以返回文件的开头。要查找任意字节偏移量,请使用 fseek 而不是 rewind。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多