fgets函式的使用

2021-06-18 11:44:35 字數 2090 閱讀 2034

以字串為單位的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()函式的使用

雖然用gets 時有空格也可以直接輸入,但是 gets 有乙個非常大的缺陷,即它不檢查預留儲存區是否能夠容納實際輸入的資料,換句話說,如果輸入的字元數目大於陣列的長度,gets 無法檢測到這個問題,就會發生記憶體越界,所以程式設計時建議使用fgets fgets 的原型為 1 include 2 c...

fgets 函式的使用分析

1 fgets函式的特點 讀取n 1 n為陣列個數,第n個位置會自動新增 0 個字元,以 n 為結束標記,並在讀取到 n 之後,在末尾處新增 0 構成字串 當讀了n 1個字元後,仍未讀到 n 也會自動新增 0 結束讀取。2 fgets的返回值 成功 返回指向該串的指標,失敗或讀到檔案結尾返回空指標,...

fread 和fgets 函式的使用

兩個函式都是對file fp 檔案進行讀取資訊,fgets是每次讀取一行,fread是一下子讀完所有的檔案內容。1 一 fread的使用 23 file fp 4int nread 5char buf 4096 6 fp fopen proc cpuinfo rb 7 nread fread buf...