古詩詞大全網 - 個性簽名 - C語言中fread的壹些疑問

C語言中fread的壹些疑問

L_o_o_n_i_e 回答得不怎麽準確!

我幫妳解釋下:

首先介紹fread函數

功 能: 從壹個流中讀數據

函數原型: int fread(void *ptr, int size, int nitems, FILE *stream); 參 數:用於接收數據的地址(指針)(ptr)

單個元素的大小(size) :單位是字節而不是位,例如讀取壹個整數值就是4 元素個數(nitems)

提供數據的文件指針(stream)

返回值:成功讀取的元素個數

由上面介紹知道fread函數的第壹個參數是個指針變量,可以指向任意類型實參!

嚴歸正傳,對於妳這裏的問題, 妳代碼中的s是個結構體數組變量,跟普通數組變量壹樣,數組名本身就是個指針常量,所以在buffer位置寫成s是沒有問題的。

那麽為什麽妳這裏讀會變亂碼呢?

雖然妳帖的代碼並沒有全,但從妳說的讀取是亂碼, 我大概猜到在妳用fwrite函數把數據寫進文件的時候是以每次壹個結構體大小(也就是僅僅是數組s的壹個元素而已,也就對應壹個下標而已)和壹個數據塊的方式寫進文件裏的。 所以當妳用fread函數讀取的時候,假設妳在buffer位置寫成s,本身語法是沒有問題的,但是就相當於妳把數組s的僅壹個元素的數據大小當成所有s的數據存到s中,也就是沒有對應起來,所以顯示會是亂碼。

所以妳可以有兩種方式實現:

方式壹:

在寫的時候按壹次以s的壹個元素的數據大小作為壹個數據塊依次寫進文件,然後讀取時候也以同樣方式讀出來。

代碼可以這麽寫:

假設s的大小為:SIZE_S

for(count = 0; count < SIZE_S; count++)

fwrite(&s[count], sizeof(struct student), 1, fp);

然後讀取時:

for(count = 0; count < SIZE_S; count++)

fread(&s[count], sizeof(struct student), 1, fp);

方式二:

以整個數組s的數據大小作為壹個數據塊壹次寫進文件,然後讀取時也同樣全部讀出來,最後可以以循環的方式打印出來。

代碼實現如下:

假設s的大小為:SIZE_S

fwrite(s, SIZE_S * sizeof(struct student), 1, fp);

然後讀取時:

fread(s, SIZE_S * sizeof(struct student), 1, fp);

最後打印:

for(count = 0; count < SIZE_S; count++)

fread(&s[count], sizeof(struct student), 1, fp);

明白了記得給哥哥頂下~~~ ^_^