【发布时间】: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);没有意义,你希望它做什么?