當前位置:才華齋>計算機>C語言>

C語言以資料塊的形式讀寫檔案例項程式碼

C語言 閱讀(1.91W)

大家知道C語言怎麼以資料塊的形式讀寫檔案嗎?下面小編為大家整理了C語言以資料塊的形式讀寫檔案例項程式碼,希望能幫到大家!

C語言以資料塊的形式讀寫檔案例項程式碼

fgets() 有侷限性,每次最多隻能從檔案中讀取一行內容,因為 fgets 遇到換行符就結束讀取。如果希望讀取多行內容,需要使用 fread 函式;相應地寫入函式為 fwrite。

fread() 函式用來從指定檔案中讀取塊資料。所謂塊資料,也就是若干個位元組的資料,可以是一個字元,可以是一個字串,可以是多行資料,並沒有什麼限制。fread() 的原型為:

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

fwrite() 函式用來向檔案中寫入塊資料,它的原型為:

size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );

對引數的說明:

ptr 為記憶體區塊的指標,它可以是陣列、變數、結構體等。fread() 中的 ptr 用來存放讀取到的`資料,fwrite() 中的 ptr 用來存放要寫入的資料。

size:表示每個資料塊的位元組數。

count:表示要讀寫的資料塊的塊數。

fp:表示檔案指標。

理論上,每次讀寫 size*count 個位元組的資料。

size_t 是在 stddef.h 標頭檔案中使用 typedef 定義的資料型別,表示無符號整數,也即非負數,常用來表示數量。

返回值:返回成功讀寫的塊數,也即 count。如果返回值小於 count:

對於 fwrite() 來說,肯定發生了寫入錯誤,可以用 ferror() 函式檢測

對於 fread() 來說,可能讀到了檔案末尾,可能發生了錯誤,可以用 ferror() 或 feof() 檢測。

【示例】從鍵盤輸入一個數組,將陣列寫入檔案再讀取出來。

#include#define N 5int main(){ //從鍵盤輸入的資料放入a,從檔案讀取的資料放入b int a[N], b[N]; int i, size = sizeof(int); FILE *fp; if( (fp=fopen("D:", "rb+")) == NULL ){ printf("Cannot open file, press any key to exit!n"); getch(); exit(1); } //從鍵盤輸入資料 並儲存到陣列a for(i=0; i<N; i++){ scanf("%d", &a[i]); } //將陣列a的內容寫入到檔案 fwrite(a, size, N, fp); //將檔案中的位置指標重新定位到檔案開頭 rewind(fp); //從檔案讀取內容並儲存到陣列b fread(b, size, N, fp); //在螢幕上顯示陣列b的內容 for(i=0; i<N; i++){ printf("%d ", b[i]); } printf("n"); fclose(fp); return 0;}

執行結果:

23 409 500 100 222↙

23 409 500 100 222

fwrite()/fread() 函式直接操作位元組,建議使用二進位制方式開啟檔案。請閱讀《C語言中文本檔案與二進位制檔案的區別》瞭解更多。

開啟 D:,發現檔案內容根本無法閱讀。這是因為我們使用"rb+"方式開啟檔案,資料以二進位制形式寫入檔案,一般無法閱讀。

資料寫入完畢後,位置指標在檔案的末尾,要想讀取資料,必須將檔案指標移動到檔案開頭,這就是rewind(fp);的作用。更多關於rewind函式的內容請點選:C語言rewind函式。

檔案的字尾不一定是 ,它可以是任意的,你可以自己命名,例如 、、 等。

【示例】從鍵盤輸入兩個學生資料,寫入一個檔案中,再讀出這兩個學生的資料顯示在螢幕上。

#include#define N 2struct stu{ char name[10]; //姓名 int num; //學號 int age; //年齡 float score; //成績}boya[N], boyb[N], *pa, *pb;int main(){ FILE *fp; int i; pa = boya; pb = boyb; if( (fp=fopen("d:", "wb+")) == NULL ){ printf("Cannot open file, press any key to exit!n"); getch(); exit(1); } //從鍵盤輸入資料 printf("Input data:n"); for(i=0; iname, &pa->num,&pa->age, &pa->score); } //將陣列 boya 的資料寫入檔案 fwrite(boya, sizeof(struct stu), N, fp); //將檔案指標重置到檔案開頭 rewind(fp); //從檔案讀取資料並儲存到資料 boyb fread(boyb, sizeof(struct stu), N, fp); //輸出陣列 boyb 中的資料 for(i=0; iname, pb->num, pb->age, pb->score); } fclose(fp); return 0;}

執行結果:

Input data:

Tom 2 15 90.5↙

Hua 1 14 99↙

Tom 2 15 90.500000

Hua 1 14 99.000000