【问题标题】:C using fstat() to read size of fileC 使用 fstat() 读取文件大小
【发布时间】:2016-10-06 21:02:04
【问题描述】:

我考虑读取未知大小的文件,我知道在此期间不会改变大小。所以我打算使用fstat()函数和struct stat。现在我正在考虑st_size 字段的真正含义以及我应该如何使用它。

如果我以这种方式获得文件大小,则分配该大小的缓冲区并准确读取该大小的字节,似乎还剩下一个字节。当我使用feof() 函数检查FILE * 中是否真的没有任何东西时,我得出了这个结论。它返回错误!所以我需要阅读 (st_size + 1) 并且只有所有字节都已被读取并且 feof() 才能正常工作。我是否应该始终将此 +1 值添加到此大小以从二进制文件中读取所有字节,或者有一些隐藏的原因导致它没有读取到 EOF

struct stat finfo;
fstat(fileno(fp), &finfo);
data_length = finfo.st_size;

我之所以问这个问题是因为当我添加+1 时,fread() 读取的字节数实际上是-1 字节少,并且最后一个字节插入00 字节。我也可以在与feof() 核对之前做这样的事情

fread(NULL, 1, 1, fp);

这是真正的代码,有点奇怪的情况:

// reading png bytes from file
    FILE *fp = fopen("./test/resources/RGBA_8bits.png", "rb");

    // get file size from file info
    struct stat finfo;
    fstat(fileno(fp), &finfo);
    pngDataLength = finfo.st_size;

    pngData = malloc(sizeof(unsigned char)*pngDataLength);
    if( fread(pngData, 1, pngDataLength, fp) != pngDataLength) {
        fprintf(stderr, "%s: Incorrect number of bytes read from file!\n", __func__);
        fclose(fp);
        free(pngData);
        return;
    }

    fread(NULL, 1, 1, fp);
    if(!feof(fp)) {
        fprintf(stderr, "%s: Not the whole binary file has been read.\n", __func__);
        fclose(fp);
        free(pngData);
        return;
    }

    fclose(fp);

【问题讨论】:

  • 不,如果一个文件的长度是 1000 字节,那么它是 1000 字节,不是 1001 也不是 999。
  • 如果您需要更详细的答案,请出示您的代码。
  • 现在可以了,但我必须添加这个 fread(NULL, 1, 1, fp);我也可以在第一个 fread() 中更改 pngDataLength +1 但它只返回 pngDataLength
  • fread(NULL, 1, 1, fp); 没有意义,你希望它做什么?

标签: c file


【解决方案1】:

这种行为是正常的。

feof 只会在您尝试读取超出文件末尾的内容时返回 true,而您在读取文件大小时不会这样做。

【讨论】:

  • ok thx 所以它只会在读取失败后设置,而不是提前检查下一次读取失败。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2019-03-26
  • 1970-01-01
  • 2011-02-01
  • 2015-07-08
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多