如何fopen().IMA文件?

时间:2015-11-17 06:16:18

标签: c binary fopen diskimage

我在C中工作并尝试读取文件系统映像(例如:name.IMA),我需要二进制形式,因为我需要逐字节读取它。在C中读取这些类型的文件的正确方法是什么?以下不起作用:

FILE *filePointer = fopen("name.IMA","rb");
fread(buffer, fileLength, 1, filePointer);

主要问题: fread()实际上是按预期打开和阅读的。混淆是因为fread()给出的返回值由于某种原因等于1(即使读取的方式超过1个字节)。这里的问题是什么?

2 个答案:

答案 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表示每个元素的大小。