我幫妳解釋下:
首先介紹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);
明白了記得給哥哥頂下~~~ ^_^