程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 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<stdio.h>
#define N 5
int main(){
    //從鍵盤輸入的數據放入a,從文件讀取的數據放入b
    int a[N], b[N];
    int i, size = sizeof(int);
    FILE *fp;

    if( (fp=fopen("D:\\demo.txt", "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:\\demo.txt,發現文件內容根本無法閱讀。這是因為我們使用"rb+"方式打開文件,數據以二進制形式寫入文件,一般無法閱讀。

數據寫入完畢後,位置指針在文件的末尾,要想讀取數據,必須將文件指針移動到文件開頭,這就是rewind(fp);的作用。更多關於rewind函數的內容請點擊:C語言rewind函數。
文件的後綴不一定是 .txt,它可以是任意的,你可以自己命名,例如 demo.ddd、demo.doc、demo.diy 等。
【示例】從鍵盤輸入兩個學生數據,寫入一個文件中,再讀出這兩個學生的數據顯示在屏幕上。
#include<stdio.h>

#define N 2

struct 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:\\demo.txt", "wb+")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        getch();
        exit(1);
    }

    //從鍵盤輸入數據
    printf("Input data:\n");
    for(i=0; i<N; i++,pa++){
        scanf("%s %d %d %f",pa->name, &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; i<N; i++,pb++){
        printf("%s  %d  %d  %f\n", pb->name, 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
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved