字串讀寫函式fgets

2021-06-08 05:53:53 字數 2710 閱讀 7936

字串讀寫函式fgets

一、讀字串函式fgets函式的功能是從指定的檔案中讀乙個字串到字元陣列中,函式呼叫的形式為: fgets(字元陣列名,n,檔案指標); 其中的n是乙個正整數。表示從檔案中讀出的字串不超過 n-1個字元。在讀入的最後乙個字元後加上串結束標誌'\0'。例如:fgets(str,n,fp);的意義是從fp所指的檔案中讀出n-1個字元送入 字元陣列str中。

[例10.4]從e10_1.c檔案中讀入乙個含10個字元的字串。

#include

main()

fgets(str,11,fp);

printf("%s",str);

fclose(fp);

} 本例定義了乙個字元陣列str共11個位元組,在以讀文字檔案方式開啟檔案e101.c後,從中讀出10個字元送入str陣列,在陣列最後乙個單元內將加上'\0',然後在螢幕上顯示輸出str陣列。輸出的十個字元正是例10.1程式的前十個字元。

對fgets函式有兩點說明:

1. 在讀出n-1個字元之前,如遇到了換行符或eof,則讀出結束。

2. fgets函式也有返回值,其返回值是字元陣列的首位址。

2012-05-28 21:10

16人閱讀收藏 

舉報以字串為單位的i/o函式

2023年12月20日 星期日 14:59

fgets從指定的檔案中讀一行字元到呼叫者提供的緩衝區中,gets從標準輸入讀一行字元到呼叫者提供的緩衝區中。

#include char *fgets(char *s, int size, file *stream);

char *gets(char *s);

返回值:成功時s指向哪返回的指標就指向哪,出錯或者讀到檔案末尾時返回null

gets函式無需解釋,man page的bugs

部分已經說得很清楚了:never use gets()。gets函式的存在只是為了相容以前的程式,我們寫的**都不應該呼叫這個函式。gets函式的介面設計得很有問題,就像strcpy一樣,使用者提供乙個緩衝區,卻不能指定緩衝區的大小,很可能導致緩衝區溢位錯誤,這個函式比strcpy更加危險,strcpy的輸入和輸出都來自程式內部,只要程式設計師小心一點就可以避免出問題,而gets讀取的輸入直接來自程式外部,使用者可能通過標準輸入提供任意長的字串,程式設計師無法避免gets函式導致的緩衝區溢位錯誤,所以唯一的辦法就是不要用它。

現在說說fgets函式,引數s是緩衝區的首位址,size是緩衝區的長度,該函式從stream所指的檔案中讀取以'/n'結尾的一行(包括'/n'在內)存到緩衝區s中,並且在該行末尾新增乙個'/0'組成完整的字串。

如果檔案中的一行太長,fgets從檔案中讀了size-1個字元還沒有讀到'/n',就把已經讀到的size-1個字元和乙個'/0'字元存入緩衝區,檔案中剩下的半行可以在下次呼叫fgets時繼續讀。

如果一次fgets呼叫在讀入若干個字元後到達檔案末尾,則將已讀到的字串加上'/0'存入緩衝區並返回,如果再次呼叫fgets則返回null,可以據此判斷是否讀到檔案末尾。

注意,對於fgets來說,'/n'是乙個特別的字元,而'/0'並無任何特別之處,如果讀到'/0'就當作普通字元讀入。如果檔案中存在'/0'字元(或者說0x00位元組),呼叫fgets之後就無法判斷緩衝區中的'/0'究竟是從檔案讀上來的字元還是由fgets自動新增的結束符,所以fgets只適合讀文字檔案而不適合讀二進位制檔案,並且文字檔案中的所有字元都應該是可見字元,不能有'/0'

fputs向指定的檔案寫入乙個字串,puts向標準輸出寫入乙個字串。

#include int fputs(const char *s, file *stream);

int puts(const char *s);

返回值:成功返回乙個非負整數,出錯返回eof

緩衝區s中儲存的是以'/0'結尾的字串,fputs將該字串寫入檔案stream,但並不寫入結尾的'/0'。與fgets不同的是,fputs並不關心的字串中的'/n'字元,字串中可以有'/n'也可以沒有'/n'puts將字串s寫到標準輸出(不包括結尾的'/0'),然後自動寫乙個'/n'到標準輸出。

字串讀寫 fgets 函式的使用

fgets 函式的使用 fgets 既可以讀檔案,又可以讀標準輸入,而且可以防止溢位。但是它只能輸入字串 且能讀到回車符 n 故而用scanf語句的較多。scanf語句可以輸入各種格式的資料,其功能較為強大。fgets 的使用方法 char fgets char string,int n,file ...

字串處理函式fgets()和gets()

scanf 一次只能接受乙個單詞,不能接受一行 gets 接受一整行的輸入,輸入多少就讀取多少,但有可能輸入的長度和要賦值的變數目標不一致而導致緩衝區溢位,這也就意味著它可能會改變不屬於當前程式所在空間的資料,一次在新標準c11中已經被廢棄不用了,不提倡使用gets gets s 新標準c11中的可...

字串和字串函式

字元輸入輸出 getchar putchar ch getchar putchar ch 字串函式 字串輸入 建立儲存空間 接受字串輸入首先需要建立乙個空間來存放輸入的字串。char name scanf s name 上述的用法可能會導致程式異常終止。使用字串陣列 可以避免上述問題 char na...