2015-11-17 117 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