-2

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

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

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

4

2 回答 2

2

如果您的fread生产线没有达到您的预期,我会查看fileLength设置的任何内容。如果它的字节数超过了可以读取的字节数,那么fread将返回零。

您需要记住的一件事是fread()返回读取的项目数,而不是字节数(我的重点):

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

成功时,fread()返回读取的项目数。此数字等于当 size 为 1 时传输的字节数。

所以这两者是有区别的:

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

第一个是读取一个大小的元素,s因此只会返回零或一。第二个是读取s大小为 1 的元素,因此可以返回0..sinclusive 的值。

如果您想一次读取尽可能多的字节,则可以使用后者

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);
}
于 2015-11-17T06:23:15.947 回答
0

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

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

在您的情况下,您将计数设置为 1。这就是为什么它只读取一个元素,即一个字节

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

于 2015-11-17T06:38:32.047 回答