gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:06 25 4
gpt4 key购买 nike

我考虑读取未知大小的文件,我知道它不会同时改变大小。所以我打算使用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,而您并没有这样做,因为您读取的正是文件的大小。

关于C 使用 fstat() 读取文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com