2015-02-08 120 views
7

我想了解<stdio.h>中的fread()函數是如何工作的,我對此函數的返回值感到困惑。在手冊頁它說fread()返回值C

返回值
成功時,fread()fwrite()返回的項目數讀 或寫入。此數字等於大小爲1時僅傳輸的字節數 。如果發生錯誤,或文件末尾達到 ,則返回值爲短項數(或零)。

fread()不和錯誤文件結束之間區分,並且 呼叫者必須使用feof(3)ferror(3)以確定發生。

有人請向我解釋在這種情況下什麼是number of items read or written。任何人都可以爲我提供一些示例返回值及其含義?

+2

'FREAD()''讀取N * K'字節,其中'N'是每個元素中的字節數,總共將讀取「K」個元素。理想情況下,如果沒有錯誤發生,將返回「K」。如果出現錯誤或文件結束條件,則可能會讀取少於'K'個元素,在這種情況下,將返回小於'K'的數字。 – 2015-02-08 19:24:52

+0

相關:http://stackoverflow.com/q/8589425/827263 – 2015-02-08 20:30:00

回答

11

fread()將讀取從所提供的IO流(FILE* stream)指定大小的項的計數。它從流中返回成功讀取的項目數。如果它返回一個小於所請求的項目數量的數字,則IO流可以被認爲是空的(或者被破壞)。

字節數讀取將等於數量的項目的成功讀取倍提供尺寸的物品的

請考慮以下程序。

#include <stdio.h> 

int main() { 
    char buf[8]; 
    size_t ret = fread(buf, sizeof(*buf), sizeof(buf)/sizeof(*buf), stdin); 
    printf("read %zu bytes\n", ret*sizeof(*buf)); 
    return 0; 
} 

當我們運行這個程序時,根據提供的輸入量,可以觀察到不同的結果。

我們根本不能提供任何輸入。 IO流將以空(EOF)開始。返回值將爲零。沒有項目被讀取。零返回。

$ : | ./a.out 
read 0 bytes 

我們根據要求提供更少的輸入。有些項目會在遇到EOF之前讀取。讀取的項目數量被返回。沒有更多的項目可用。此後,該流是空的。

$ echo "Hello" | ./a.out 
read 6 bytes 

我們根據您的要求提供相同或更多的輸入。所請求的項目數量將被退回。更多的項目可能會提供。

$ echo "Hello World" | ./a.out 
read 8 bytes 

相關閱讀:

當存在流中更少的字節比之和構成的項目,字節的數目消耗從流然而可能是更大的根據上述公式計算的字節數的讀數爲。這個答案上面鏈接的問題(和它的評論),我覺得在這個問題上特別有見地:

+0

如果一個文件的fread()長度爲7個字節,大小設置爲1,2和4,那麼你的程序會更有幫助(關於這個問題)。 – 2015-02-08 19:59:49

3

fread()的語法是

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

這意味着,

功能fread()讀取數據的nmemb元素,每個size字節長,從流通過stream指出,存儲他們在ptr給出的位置。

因此,讀取的總字節數將是nmemb * size

現在,說

成功

,FREAD()和fwrite()返回的項目數讀取或寫入。這個數目等於僅傳輸的字節數時大小爲1

這意味着,返回值將等於nmembsize1.

Logic是一樣的,在fwrite()也如此。


編輯

例如,一個完全成功調用fread()

fread(readbuf, sizeof(int), 5 , stdin); 

將返回5,同時它會讀取sizeof(int) * 5字節。如果我們假設sizeof(int)4,那麼讀取的總字節數將是5 * 420。正如你所看到的,在這裏,讀取或寫入的項目數不等於轉移的字節數

OTOH,另一個完全成功調用fread()

fread(readbuf, sizeof(char), 5 , stdin); 

也將返回5,同時它會讀取sizeof(char) * 5個字節,即5字節。在這種情況下,由於sizeof(char)1,所以在這裏讀取或寫入的項目數等於轉換的字節數。即,5

+0

大小!= 1時發生了什麼?我正在閱讀通過結構的大小的代碼到這個函數。 – 2015-02-08 19:33:54

+0

@JordanCamp我已更新。希望現在清楚。 :-) – 2015-02-08 19:56:47

0

讀取或寫入的項目數表示從FILE流讀取到緩衝區的size_t大小的對象數。當你打算從FILE中讀取N個字節進行緩衝時,它應該返回N,並且你可以將它存儲在一個變量中,看它是否真的讀取了所有的字節。如果返回值!= N,則表示發生錯誤。例如,如果你有一個包含4個32位整數的文件,你可以用elements_read = fread(buf,sizeof(int),4,fp)來讀取它。 bytes_read緩存然後應該是4,如果沒有錯誤發生

+0

這並不意味着字節數,除非給定的塊大小是1個字節。 – hyde 2015-02-08 19:31:01

+0

好吧,它確實是size_t大小的元素,我的壞 – BsD 2015-02-08 19:39:38

+1

請修復或刪除這個答案 - 所以我們不必倒推它,然後將其標記爲刪除。 – 2015-02-08 19:49:14