C語言以字串的形式讀寫檔案
C語言以字串的形式讀寫檔案
fgetc() 和 fputc() 函式每次只能讀寫一個字元,速度較慢;實際開發中往往是每次讀寫一個字串或者一個數據塊,這樣能明顯提高效率。
讀字串函式fgets
fgets() 函式用來從指定的檔案中讀取一個字串,並儲存到字元陣列中,它的原型為:
char *fgets ( char *str, int n, FILE *fp );
str 為字元陣列,n 為要讀取的字元數目,fp 為檔案指標。
返回值:讀取成功時返回字元陣列首地址,也即 str;讀取失敗時返回 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() 最多隻能讀取一行資料,不能跨行。在
【示例】一行一行地讀取檔案。
#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