fgets

fgets

從檔案結構體指針stream中讀取數據,每次讀取一行。讀取的數據保存在buf指向的字元數組中,每次最多讀取bufsize-1個字元(第bufsize個字元賦'\0'),如果檔案中的該行,不足bufsize-1個字元,則讀完該行就結束。如若該行(包括最後一個換行符)的字元數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩衝區總是以NULL字元結尾,對fgets的下一次調用會繼續讀該行。函式成功將返回buf,失敗或讀到檔案結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函式是否是出錯而終止的,應該藉助feof函式或者ferror函式來判斷。

基本信息

函式 (ISO C)

函式原型

char *fgets(char *buf, int bufsize, FILE *stream);

參數

*buf: 字元型指針,指向用來存儲所得數據的地址。

bufsize: 整型數據,指明存儲數據的大小。

*stream: 檔案結構體指針,將要讀取的檔案流。

返回值

成功,則返回第一個參數buf;

在讀字元時遇到end-of-file,則eof指示器被設定,如果還沒讀入任何字元就遇到這種情況,則buf保持原來的內容,返回NULL;

如果發生讀入錯誤,error指示器被設定,返回NULL,buf的值可能被改變。

1.

成功,則返回第一個參數buf;

2.

在讀字元時遇到end-of-file,則eof指示器被設定,如果還沒讀入任何字元就遇到這種情況,則buf保持原來的內容,返回NULL;

3.

如果發生讀入錯誤,error指示器被設定,返回NULL,buf的值可能被改變。

功能

注意1:《UNIX 環境高級編程》中指出,每次調用fgets函式會造成標準輸出設備自動刷清!案例詳見《UNIX環境高級編程(第二版)》中程式清單1-5和課後習題5.7,習題5.7的答案中給出了相關的論述。

注意2:初入門者,大多數是在WINDOWS下,使用VS進行練習的。此環境下,對注意1中的情況進行測試,並不能看到案例中所描述的情景,因為具體的實現不同。

stream檔案流指針體指向檔案內容地址的偏移原則

如果使用fgets()讀取某個檔案,第一次讀取的bufsize為5,而檔案的第一行有10個字元(算上'\n'),那么讀取檔案的指針會偏移至當前讀取完的這個字元之後的位置。也就是第二次再用fgets()讀取檔案的時候,則會繼續讀取其後的字元。而,如果使用fgets() 讀取檔案的時候bufsize大於該行的字元總數加2(多出來的兩個,一個保存檔案本身的'\n'換行,一個保存字元串本身的結束標識'\0'),檔案並不會繼續讀下去,僅僅只是這一行讀取完,隨後指向檔案的指針會自動偏移至下一行。

例:

如果一個檔案的當前位置的文本如下

Love, I Have

Since you can do it.

如果用fgets(str1,6,file1);去讀取

則執行後str1 = "Love," ,讀取了6-1=5個字元

這個時候再執行fgets(str1,20,file1)則執行後str1 = " I Have\n"

而如果

fgets(str1,23,file1);

則執行str1="Love ,I Have",讀取了一行(包括行尾的'\n',並自動加上字元串結束符'\0'),當前檔案位置移至下一行,雖然23大於當前行上字元總和,可是不會繼續到下一行。而下一次調用fgets()繼續讀取的時候是從下一行開始讀。

序例

fgets函式用來從檔案中讀入字元串。fgets函式的調用形式如下:fgets(str,n,fp);此處,fp是檔案指針;str是存放在字元串的起始地址;n是一個int類型變數。函式的功能是從fp所指檔案中讀入n-1個字元放入str為起始地址的空間內;如果在未讀滿n-1個字元之時,已讀到一個換行符或一個EOF(檔案結束標誌),則結束本次讀操作,讀入的字元串中最後包含讀到的換行符。因此,確切地說,調用fgets函式時,最多只能讀入n-1個字元。讀入結束後,系統將自動在最後加'\0',並以str作為函式值返回。

函式原型是:char *fgets(char *s, int n, FILE *stream);

函式使用

同時可以用作鍵盤輸入:fgets(key,n,stdin)且還必須:key[strlen(key)]="\0"或者key[n-1]="\0"

還有種程式經常使用的方法:key[strlen(key-1)]=0x00;

與gets相比使用這個好處是:讀取指定大小的數據,避免gets函式從stdin接收字元串而不檢查它所複製的快取的容積導致的快取溢出問題。

相關詞條

相關搜尋

熱門詞條

聯絡我們