以字串為單位的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...