繁体   English   中英

C 使用 fstat() 读取文件大小

[英]C using fstat() to read size of file

我考虑读取未知大小的文件,我知道在此期间不会改变大小。 所以我打算使用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);

这种行为很正常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM