我在C中工作并尝试读取文件系统映像(例如:name.IMA),我需要二进制形式,因为我需要逐字节读取它。在C中读取这些类型的文件的正确方法是什么?以下不起作用:
FILE *filePointer = fopen("name.IMA","rb");
fread(buffer, fileLength, 1, filePointer);
主要问题: fread()实际上是按预期打开和阅读的。混淆是因为fread()给出的返回值由于某种原因等于1(即使读取的方式超过1个字节)。这里的问题是什么?
答案 0 :(得分:2)
如果您的fread
行未按预期执行,我会查看fileLength
设置的内容。如果它的字节数多于可读取的字节数,那么fread
将返回零。
您需要记住的一件事是fread()
返回项读取的数量,而不是 bytes 的数量(我的重点):< / p>
size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);
成功后,
fread()
会返回 项 读取的数量。当数字为1时,此数字等于 仅 传输的字节数。
所以这两者之间存在差异:
size_t n = fread (buffer, s, 1, fp);
size_t n = fread (buffer, 1, s, fp);
第一个是读取大小为s
的一个元素,因此只返回0或1。第二个是读取大小为1的s
个元素,因此可以返回0..s
个值。
后者是您想要使用的那个,因为您希望一次读取多少字节,因为您可以放入缓冲区:
char buff[128];
size_t sz;
FILE *fp = fopen ("name.ima", "rb");
if (fp != NULL) {
while ((sz = fread (buff, 1, sizeof (buff), fp)) > 0)
doSomethingWith (buffer, sz);
fclose (fp);
}
答案 1 :(得分:0)
你的fread返回1,因为它被要求只读一个元素
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
在您的情况下,您将计数设置为1.这就是为什么它只读取一个元素,即一个字节
此外,您将大小设置为fileLength,这是错误的。 size表示每个元素的大小。