標準I O庫之每次一行I O

2022-05-04 20:24:10 字數 1287 閱讀 8162

下面兩個函式提供每次輸入一行的功能。

#include 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的手冊(2023年)中就說明:「為了向後相容,gets刪除換行符,而fgets則保持換行符。」

即使iso c要求實現提供gets,但請使用fgets,而不要使用gets。

fputs和puts提供每次輸出一行的功能。

#include 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環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:

APUE 再讀之 標準IO庫

本章介紹標準io庫 1.file物件 標準io庫一切函式基於file物件。file物件包含了管理該流的所有資訊 檔案描述符,指向流快取的指標,快取的長度,快取的位元組數以及出錯標識等 2.標準輸入,標準輸出和標準出錯。對應非標準io stdin fileno,stdout fileno,stderr...

標準I O庫之定位流

有三種方法定位標準i o流。1 ftell和fseek函式。這兩個函式自v7以來就存在了,但是它們都假定檔案的位置可以存放在乙個長整型中。2 ftello和fseeko函式。single unix specification引入了這兩個函式,可以使檔案偏移量不必一定使用長整型。它們使用off t資料...

C 標準庫之IO庫(二)

fstream檔案中定義了三種支援檔案io的型別,ifstream提供讀檔案的功能,ofstream提供寫檔案的功能,fstream提供讀寫檔案的功能。因為它們分別是從istream,ostream,iostream繼承來的,所以可以使用操作符 和 進行格式化的輸入輸出,條件流狀態也可以使用。除了繼...