1. 程式人生 > >C語言以字串的形式讀寫檔案

C語言以字串的形式讀寫檔案

C語言以字串的形式讀寫檔案

fgetc() fputc() 函式每次只能讀寫一個字元,速度較慢;實際開發中往往是每次讀寫一個字串或者一個數據塊,這樣能明顯提高效率。

讀字串函式fgets

fgets() 函式用來從指定的檔案中讀取一個字串,並儲存到字元陣列中,它的原型為:

char *fgets ( char *str, int n, FILE *fp );

str 為字元陣列,n 為要讀取的字元數目,fp 為檔案指標。

返回值:讀取成功時返回字元陣列首地址,也即 str;讀取失敗時返回 NULL;如果開始讀取時檔案內部指標已經指向了檔案末尾,那麼將讀取不到任何字元,也返回

NULL

注意,讀取到的字串會在末尾自動新增 '\0'n 個字元也包括 '\0'。也就是說,實際只讀取到了 n-1 個字元,如果希望讀取 100 個字元,n 的值應該為 101。例如:

#define N 101

char str[N];

FILE *fp = fopen("D:\\demo.txt", "r");

fgets(str, N, fp);

表示從 D:\\demo.txt 中讀取100個字元,並儲存到字元陣列str中。

需要重點說明的是,在讀取到 n-1 個字元之前如果出現了換行,或者讀到了檔案末尾,則讀取結束。這就意味著,不管n的值多大,fgets() 最多隻能讀取一行資料,不能跨行。在

C語言中,沒有按行讀取檔案的函式,我們可以藉助 fgets(),將n的值設定地足夠大,每次就可以讀取到一行資料。

【示例】一行一行地讀取檔案。

#include <stdio.h>

#include <stdlib.h>

#define N 100

int main(){

    FILE *fp;

    char str[N+1];

    if( (fp=fopen("d:\\demo.txt","rt")) == NULL ){

        printf("Cannot open file, press any key to exit!\n");

        getch();

        exit(1);

    }

  

    while(fgets(str, N, fp) != NULL){

        printf("%s", str);

    }

    fclose(fp);

    system("pause");

    return 0;

}

fgets() 遇到換行時,會將換行符一併讀取到當前字串。該示例的輸出結果之所以和 demo.txt 保持一致,該換行的地方換行,就是因為 fgets() 能夠讀取到換行符。而 gets() 不一樣,它會忽略換行符。

寫字串函式fputs

fputs() 函式用來向指定的檔案寫入一個字串,它的原型為:

int fputs( char *str, FILE *fp );

str 為要寫入的字串,fp 為檔案指標。寫入成功返回非負數,失敗返回EOF。例如:

char *str = "http://c.biancheng.net";

FILE *fp = fopen("D:\\demo.txt", "at+");

fputs(str, fp);

表示把把字串 str 寫入到 D:\\demo.txt 檔案中。

【示例】向上例中建立的 d:\\demo.txt 檔案中追加一個字串。

#include<stdio.h>

int main(){

    FILE *fp;

    char str[102] = {0}, strTemp[100];

    if( (fp=fopen("D:\\demo.txt", "at+")) == NULL ){

        printf("Cannot open file, press any key to exit!\n");

        getch();

        exit(1);

    }

    printf("Input a string:");

    gets(strTemp);

    strcat(str, "\n");

    strcat(str, strTemp);

    fputs(str, fp);

    fclose(fp);

    return 0;

}

執行程式,輸入C C++ Java Linux Shell,開啟 D:\\demo.txt,檔案內容為:

C C++ Java Linux Shell