下面兩個函數提供每次輸入一行的功能。
#include <stdio.h>char *fgets( char *restrict buf, int n, FILE *restrict fp );char *gets( char *buf );兩個函數返回值:若成功則返回buf,若已到達文件結尾或出錯則返回NULL
這兩個函數都指定了緩沖區的地址,讀入的行將送入其中。gets從標準輸入讀,而fgets則從指定的流讀。
對于fgets,必須指定緩沖區的長度n。此函數一直讀到下一個換行符為止,但是不超過n-1個字符,讀入的字符(包括換行符)被送入緩沖區。該緩沖區以null字符結尾。如若該行(包括最后一個換行符)的字符數超過n-1,則fgets只返回一個不完整的行,但是,緩沖區總是以null字符結尾。對fgets的下一次調用會繼續讀該行。
gets是一個不推薦使用的函數。其問題是調用者在使用gets時不能指定緩沖區的長度。這樣就可能造成緩沖區溢出(如若該行長于緩沖區長度),寫到緩沖區之后的存儲空間中,從而產生不可預料的結果。gets與fgets的另一個區別是,gets并不將換行符存入緩沖區中。
這兩個函數處理換行符方面的差別與UNIX系統的演進有關。早在V7的手冊(1979年)中就說明:“為了向后兼容,gets刪除換行符,而fgets則保持換行符。”
即使ISO C要求實現提供gets,但請使用fgets,而不要使用gets。
fputs和puts提供每次輸出一行的功能。
#include <stdio.h>int fputs( const char *restrict str, FILE *restrict fp );int puts( const char *str );兩個函數返回值:若成功則返回非負值,若出錯則返回EOF
函數fputs將一個以null符終止的字符串寫到指定的流,尾端的終止符null不寫出。注意,這并不一定是每次輸出一行,因為它并不要求在null符之前一定是換行符。通常,在null符之前是一個換行符,但并不要求總是如此。
puts將一個以null符終止的字符串寫到標準輸出,終止字符不寫出。但是,puts然后又將一個換行符寫到標準輸出。
puts并不像它所對應的gets那樣不安全。但是我們還是應避免使用它,以免需要記住它在最后是否添加了一個換行符。如果總是使用fgets和fputs,那么就會熟知在每行終止處我們必須自己處理換行符。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答