C語(yǔ)言 以字符串的形式讀寫(xiě)文件詳解及示例代碼
fgetc() 和 fputc() 函數(shù)每次只能讀寫(xiě)一個(gè)字符,速度較慢;實(shí)際開(kāi)發(fā)中往往是每次讀寫(xiě)一個(gè)字符串或者一個(gè)數(shù)據(jù)塊,這樣能明顯提高效率。
讀字符串函數(shù)fgets
fgets() 函數(shù)用來(lái)從指定的文件中讀取一個(gè)字符串,并保存到字符數(shù)組中,它的原型為:
char *fgets ( char *str, int n, FILE *fp );
str 為字符數(shù)組,n 為要讀取的字符數(shù)目,fp 為文件指針。
返回值:讀取成功時(shí)返回字符數(shù)組首地址,也即 str;讀取失敗時(shí)返回 NULL;如果開(kāi)始讀取時(shí)文件內(nèi)部指針已經(jīng)指向了文件末尾,那么將讀取不到任何字符,也返回 NULL。
注意,讀取到的字符串會(huì)在末尾自動(dòng)添加 '\0',n 個(gè)字符也包括 '\0'。也就是說(shuō),實(shí)際只讀取到了 n-1 個(gè)字符,如果希望讀取 100 個(gè)字符,n 的值應(yīng)該為 101。例如:
#define N 101
char str[N];
FILE *fp = fopen("D:\\demo.txt", "r");
fgets(str, N, fp);
表示從 D:\\demo.txt 中讀取100個(gè)字符,并保存到字符數(shù)組str中。
需要重點(diǎn)說(shuō)明的是,在讀取到 n-1 個(gè)字符之前如果出現(xiàn)了換行,或者讀到了文件末尾,則讀取結(jié)束。這就意味著,不管n的值多大,fgets() 最多只能讀取一行數(shù)據(jù),不能跨行。在C語(yǔ)言中,沒(méi)有按行讀取文件的函數(shù),我們可以借助 fgets(),將n的值設(shè)置地足夠大,每次就可以讀取到一行數(shù)據(jù)。
【示例】一行一行地讀取文件。
#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;
}
將下面的內(nèi)容復(fù)制到 D:\\demo.txt:
C語(yǔ)言中文網(wǎng)
http://c.biancheng.net
一個(gè)學(xué)習(xí)編程的好網(wǎng)站!
那么運(yùn)行結(jié)果為:

fgets() 遇到換行時(shí),會(huì)將換行符一并讀取到當(dāng)前字符串。該示例的輸出結(jié)果之所以和 demo.txt 保持一致,該換行的地方換行,就是因?yàn)?fgets() 能夠讀取到換行符。而 gets() 不一樣,它會(huì)忽略換行符。
寫(xiě)字符串函數(shù)fputs
fputs() 函數(shù)用來(lái)向指定的文件寫(xiě)入一個(gè)字符串,它的原型為:
int fputs( char *str, FILE *fp );
str 為要寫(xiě)入的字符串,fp 為文件指針。寫(xiě)入成功返回非負(fù)數(shù),失敗返回EOF。例如:
char *str = "http://c.biancheng.net";
FILE *fp = fopen("D:\\demo.txt", "at+");
fputs(str, fp);
表示把把字符串 str 寫(xiě)入到 D:\\demo.txt 文件中。
【示例】向上例中建立的 d:\\demo.txt 文件中追加一個(gè)字符串。
#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;
}
運(yùn)行程序,輸入C C++ Java Linux Shell,打開(kāi) D:\\demo.txt,文件內(nèi)容為:
C語(yǔ)言中文網(wǎng)
http://c.biancheng.net
一個(gè)學(xué)習(xí)編程的好網(wǎng)站!
C C++ Java Linux Shell
以上就是 C語(yǔ)言字符串的形式讀取文件,后續(xù)繼續(xù)整理相關(guān)資料,謝謝大家對(duì)本站的支持!
- C語(yǔ)言中的各種文件讀寫(xiě)方法小結(jié)
- c語(yǔ)言文件讀寫(xiě)示例(c語(yǔ)言文件操作)
- C語(yǔ)言讀寫(xiě)配置文件的方法
- C語(yǔ)言以數(shù)據(jù)塊的形式讀寫(xiě)文件實(shí)例代碼
- C語(yǔ)言 文件的隨機(jī)讀寫(xiě)詳解及示例代碼
- C語(yǔ)言實(shí)現(xiàn)按行讀寫(xiě)文件
- C語(yǔ)言 以字符形式讀寫(xiě)文件詳解及示例代碼
- C語(yǔ)言實(shí)現(xiàn)文件讀寫(xiě)
- C語(yǔ)言實(shí)現(xiàn)文件讀寫(xiě)操作
- C語(yǔ)言文件讀寫(xiě)操作介紹與簡(jiǎn)單示例
相關(guān)文章
C++類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)示例
類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換是面向?qū)ο缶幊讨刑幚眍愋椭g轉(zhuǎn)換的兩種重要機(jī)制,本文就來(lái)介紹一下這兩種方法的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
解析C++浮點(diǎn)數(shù)無(wú)效值的定義與無(wú)效值判定的小結(jié)
本篇文章是對(duì)C++中浮點(diǎn)數(shù)無(wú)效值的定義與無(wú)效值的判定進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言圣誕樹(shù)的實(shí)現(xiàn)示例
本篇主要介紹了C語(yǔ)言圣誕樹(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼
多態(tài)是C++中最重要的特性之一,對(duì)虛函數(shù)的調(diào)用在C++代碼中是隨處可見(jiàn)的,本篇文章我們?cè)敿?xì)探討一下,感興趣的朋友快來(lái)看看吧2021-11-11
盤(pán)點(diǎn)分析C語(yǔ)言中少見(jiàn)卻強(qiáng)大的字符串函數(shù)
這篇文章主要為大家盤(pán)點(diǎn)及分析C語(yǔ)言中少見(jiàn)卻強(qiáng)大的字符串函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
詳解C++中String類模擬實(shí)現(xiàn)以及深拷貝淺拷貝
這篇文章主要介紹了詳解C++中String類模擬實(shí)現(xiàn)以及深拷貝淺拷貝的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下2017-10-10

