如何 fopen() .IMA 文件?

How to fopen() a .IMA file?

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

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

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

如果您的 fread 行没有达到您的预期,我会查看 fileLength 的设置。如果字节数多于可读取的字节数,则 fread 将 return 归零。

您需要记住的一件事是 fread() return 阅读的 的数量,而不是 bytes(我强调):

size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);

On success, fread() return the number of items read. This number equals the number of bytes transferred only when size is 1.

所以这两者是有区别的:

size_t n = fread (buffer, s, 1, fp);
size_t n = fread (buffer, 1, s, fp);

第一个是读取最多 一个 个大小为 s 的元素,因此只会 return 零或一个。第二个是读取最多 s 个大小为 1 的元素,因此可以 return 包含 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);
}

你的 fread returns 1 因为它被要求只读取一个元素

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

在你的例子中,你将计数设置为 1。这就是为什么它只读取一个元素,即一个字节

此外,您将大小设置为fileLength,这是错误的。 size表示每个元素的大小。