C C 檔案讀取常用函式及新手易犯錯誤

2021-06-16 21:18:53 字數 1285 閱讀 6328

1. c語言中,注意getline()和fgets()的區別,兩者都是讀取檔案的一行。但是用法有所區別。

getline()的定義是

size_t getline(char ** s, size_t * n, file* fp);

該函式在呼叫的時候,不用為s分配記憶體,該函式內部會為其動態分配記憶體,如果呼叫成功,將返回分配記憶體的長度。碰到檔案結尾則返回eof,即-1. 例如

#include

#include

int main()

} 需要注意的是,將s初始化為null,每次讀取完畢,釋放s,再將其設定為null是不可缺少的,否則,這個函式不一定能執行成功。因為s可能指向乙個不可訪問的記憶體位址。會得到segmentation fault (core dump)的錯誤。

fgets()的定義是

char * fgets(char * s, int n, file * fp);

s必須提前被分配記憶體,不管是動態分配,還是陣列形式,n是讀取長度的上限。成功時,返回buf,否則返回null. 用於接收返回值的字元型指標則不需要提前分配記憶體。

2. 注意c中getline 與 c++中get的區別

c++中getline主要有兩種形式,一種是以輸入流(istream, ifstream)的成員函式呼叫,一種是string類的成員函式呼叫。前者需要istream,ifstream,後者需要string

以輸入流成員函式呼叫

istream & getline(char * s, int n) 或 istream & getline(char * s, int n, char c)

s必須事先分配記憶體,n是最長讀取長度,c是指示讀取終止的字元,前者,並不讀取換行符。後者也不讀取控制字元c。

以string成員函式呼叫

istream & getline(istream & istr, string & s) 或 istream & getline(istream & istr, string & s, char c)

s定義時可以使用string的預設建構函式,即string s; 同樣這兩個函式也不讀取還行符或者控制字元c。

3. 檔案重新定位後需要注意的問題

在c語言裡面,檔案讀到檔案末尾之後,用fseek()函式可以直接重新定位,並且繼續讀取。然而在c++裡面,用檔案輸入流成員函式seekg()來重新定位,不一定能繼續讀取。這取決於前一次的讀取是否遇到了檔案末尾,如果遇到了,必須在seekg()之前,先呼叫檔案輸入流成員函式clear()。

C C 常用函式易錯點

include void memset void buffer,int ch,size t count 將記憶體中buffer的前count個 位元組的內容全部設定為ch指定的ascii值.經常用來初始化陣列.複製時 以位元組為單位,如果buffer是int long,或者其他型別的指標時,需要注意...

C C 語言常用標頭檔案及函式

include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 include 定義各種資料型別最值常量 include 定義本地化函式 include ...

c c 常用標頭檔案函式

標頭檔案 ctype.h 字元處理函式 本類別函式用於對單個字元進行處理,包括字元的類別測試和字元的大小寫轉換 字元測試是否字母和數字 isalnum 是否字母 isalpha 是否控制字元 iscntrl 是否數字 isdigit 是否可顯示字元 除空格外 isgraph 是否可顯示字元 包括空格...