2015-11-17 95 views
-2

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

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

主要问题:的FREAD()实际上是打开和读取预期。令人困惑的是fread()给出的返回值由于某种原因等于1(尽管读取的方式多于1个字节)。这里有什么问题?

+0

什么是'fileLength'初始化为?你是如何选择这个价值的?你测试了'fopen()'返回的值吗? 'fread()'返回的那个? –

回答

2

如果您的fread行不符合您的预期,我会查看fileLength设置的任何值。如果它的字节数多于可读数,则fread将返回零。你需要记住

的一件事是,项目fread()退货数量,而不是字节(我的重点)的数量:

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,因此只会返回零或一个。第二个是读取尺寸为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); 
} 
+0

好的,情况就是这样。 fread()实际上是按照预期打开和阅读的。令人困惑的是,由于fread()给出的返回值是由于某种原因1(即使读取了多于1个字节的方式)。这里有什么问题? – Vimzy

+1

@Vimzy,你已经指定读取大小为'fileLength'的*一个*元素。 'fread()'返回*元素*的数量,而不是字节数。如果你交换参数'fread(buffer,1,fileLength,filePointer)',你需要读取大小为1的'fileLength'元素,你将得到读取的字节数。 – paxdiablo

+0

最后一个说明,fread()是否在缓冲区的末尾插入了一个空终止符?缓冲区是一个ints(使用malloc制作)的指针? – Vimzy

0

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

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

在你的情况,你要设置的计为1。这就是为什么它的读数只有一个元素,即一个字节

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

+0

只有一个挑剔:当大小为1时,一个元素只是一个字节,正如你在下面的文字中所说的那样,情况并非如此。否则它将是多个字节长。实际上,两个nitpicks,因为它是完全可以接受的,有一个元素的大小与文件相同,如果你想只是原子加载整个文件。在某些情况下,您应该单独加载元素,但我不认为这是其中之一。 – paxdiablo