因?yàn)閒gets函數(shù)只能輸入字符串,而Scanf()能輸入多種類型的數(shù)據(jù),加上一般的C語(yǔ)言教材往往重視講授原理,而對(duì)程序健壯性、異常處理等考慮不多,所以一般資料很少提及fgets函數(shù)。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),靜樂企業(yè)網(wǎng)站建設(shè),靜樂品牌網(wǎng)站建設(shè),網(wǎng)站定制,靜樂網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,靜樂網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
scanf在獲取用戶輸入的字符串時(shí),遇到空格、制表符即終止,并在結(jié)尾自動(dòng)加上”\0″。gets在獲取用戶輸入字符串時(shí),遇到空格、制表符不會(huì)終止,在結(jié)尾也會(huì)自動(dòng)加上“\0”。
由于scanf和gets這兩個(gè)函數(shù)不對(duì)輸入的長(zhǎng)度進(jìn)行核查,即使用戶輸入超過了規(guī)定的buffer容量,函數(shù)也會(huì)接受輸入,造成緩沖區(qū)溢出,程序崩潰。所以建議實(shí)際使用時(shí)最好用fgets函數(shù)來(lái)替代。
附上fgets函數(shù)的有關(guān)說明:
fgets函數(shù)原型:char
*fgets(char
*buf,
int
bufsize,
FILE
*stream);
參數(shù):
1.
*buf:
字符型指針,指向用來(lái)存儲(chǔ)所得數(shù)據(jù)的地址。
2.
bufsize:
整型數(shù)據(jù),指明存儲(chǔ)數(shù)據(jù)的大小。即每次最多讀取bufsize-1個(gè)字符(第bufsize個(gè)字符賦'\0'),如果文件中的該行,不足bufsize個(gè)字符,則讀完該行就結(jié)束。如若該行(包括最后一個(gè)換行符)的字符數(shù)超過bufsize-1,則fgets只返回一個(gè)不完整的行,但是,緩沖區(qū)總是以NULL字符結(jié)尾,對(duì)fgets的下一次調(diào)用會(huì)繼續(xù)讀該行。
3.
*stream:
文件結(jié)構(gòu)體指針,將要讀取的文件流。如為stdin,則從鍵盤讀取。
返回值:
成功,則返回第一個(gè)參數(shù)buf;
在讀字符時(shí)遇到End-of-File,則EOF被設(shè)置,如果還沒讀入任何字符就遇到這種情況,則buf保持原來(lái)的內(nèi)容,返回NULL;如果發(fā)生讀入錯(cuò)誤,ERROR被設(shè)置,返回NULL,buf的值可能被改變。因此我們不能直接通過fgets的返回值來(lái)判斷函數(shù)是否是出錯(cuò)而終止的,應(yīng)該借助feof函數(shù)或者ferror函數(shù)來(lái)判斷。
//用函數(shù)fputs寫入時(shí),可以通過寫入\n或\r\n來(lái)寫入換行符,但fputs不會(huì)自動(dòng)在字符串的末尾追加換行符。
//函數(shù)fgets的原型是:char* fgets(char *str,int num,FILE *stream)。
//用函數(shù)fgets讀取時(shí),會(huì)從給出的文件流stream中讀取[num - 1]個(gè)字符,
//并把它們轉(zhuǎn)儲(chǔ)到str(字符串)中, 但如果在讀到[num - 1]個(gè)字符之前遇到了第一個(gè)換行符,
//會(huì)提前結(jié)束,并將換行符之前的字符連同這個(gè)換行符轉(zhuǎn)儲(chǔ)到str(字符串)中。
//下面有例子。
#includestdio.h
#includestdlib.h
#includestring.h
int main()
{
char f[]="t.txt",buf[1024]={'\0'};
FILE *io=fopen(f,"w");
fputs("第一行",io);
fputs(",還是第一行\(zhòng)n",io);
fputs("第二行\(zhòng)r\n",io);
fputs("第三行\(zhòng)n",io);
fputs("hello\nworld",io);
fclose(io);
io=fopen(f,"r");
fgets(buf,1024,io);
fclose(io);
puts(buf);
if('\n'==buf[strlen(buf)-1])
{
puts("讀到了換行符。");
}
else
{
puts("未讀到換行符。");
}
system("PAUSE");
return 0;
}
fgets為stdin.h頭文件中聲明的,從文件中讀取字符串的函數(shù)。
原型:
char?*fgets(char?*buf,?int?bufsize,?FILE?*stream);
參數(shù):
buf: 指向用來(lái)存儲(chǔ)字符串的內(nèi)存位置。
bufsize:?讀取數(shù)據(jù)的大小。
stream: 將要讀取的文件流。
fgets最多從文件中讀取bufsize-1個(gè)字符,若讀取的行不足bufsize-1個(gè)字符,則讀取完這行后就結(jié)束;若讀取的行超過bufsize-1個(gè)字符,則只讀取bufsize-1個(gè)字符,下次調(diào)用fgets時(shí),將從此行未讀取完的位置繼續(xù)讀取。
示例:
#include?stdio.h
int?main()
{
char?s[60];
FILE?*fin?=?fopen("a.txt",?"r");
fgets(s,?60,?fin);
puts(s);
fclose(fin);
return?0;
}
fgets函數(shù)功能為從指定的流中讀取數(shù)據(jù),每次讀取一行。其原型為:char *fgets(char *str, int n, FILE *stream);從指定的流 stream 讀取一行,并把它存儲(chǔ)在 str 所指向的字符串內(nèi)。當(dāng)讀取 (n-1) 個(gè)字符時(shí),或者讀取到換行符時(shí),或者到達(dá)文件末尾時(shí),它會(huì)停止。
樓主沒有說清具體要執(zhí)行的規(guī)則,只有一個(gè)例子。如果是固定的第一行以及從此行中截取前三個(gè)字符為一行,這就比較容易處理。
下面是程序的代碼和文件內(nèi)容以及運(yùn)行截圖:
#include
int main()
{ FILE *fp;
char s[300];
fp=fopen("test.txt","r");
fgets(s,4,fp);
printf("%s\n",s);
while(!feof(fp))
{ fgets(s,300,fp);
printf("%s",s);
}
return 0;
}