linux fgets() 介面使用
阿新 • • 發佈:2019-02-11
從檔案結構體指標stream中讀取資料,每次讀取一行。讀取的資料儲存在buf指向的字元陣列中,每次最多讀取bufsize-1個字元(第bufsize個字元賦'\0'),如果檔案中的該行,不足bufsize個字元,則讀完該行就結束。如若該行(包括最後一個換行符)的字元數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩衝區總是以NULL字元結尾,對fgets的下一次呼叫會繼續讀該行。函式成功將返回buf,失敗或讀到檔案結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函式是否是出錯而終止的,應該藉助feof函式或者ferror函式來判斷
函式原型
char *fgets(char *buf, int bufsize, FILE *stream);引數
返回值
- 成功,則返回第一個引數buf;
- 在讀字元時遇到end-of-file,則eof指示器被設定,如果還沒讀入任何字元就遇到這種情況,則buf保持原來的內容,返回NULL;
- 如果發生讀入錯誤,error指示器被設定,返回NULL,buf的值可能被改變。[1]
功能
注意:《UNIX 環境高階程式設計》中指出,每次呼叫fgets函式會造成標準輸出裝置自動刷清!案例詳見《UNIX環境高階程式設計(第二版)》中程式清單1-5和課後習題5.7,習題5.7的答案中給出了相關的論述。 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個序例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include<string.h> #include<stdio.h>
int main ( void )
{
FILE *stream;
char string[]= "Thisisatest" ;
char msg[20];
/*openafileforupdate*/
stream= fopen ( "DUMMY.FIL" , "w+" );
/*writeastringintothefile*/
fwrite (string, strlen (string),1,stream);
/*seektothestartofthefile*/
fseek (stream,0,SEEK_SET);
/*readastringfromthefile*/
fgets (msg, strlen (string)+1,stream);
/*displaythestring*/
printf ( "%s" ,msg);
fclose (stream);
return 0;
}
|
函式使用
同時可以用作鍵盤輸入:fgets(key,n,stdin)且還必須:key[strlen(key)]='\0'或者key[n-1]='\0'
還有種程式經常使用的方法:key[strlen(key-1)]=0x00;
與gets相比使用這個好處是:讀取指定大小的資料,避免gets函式從stdin接收字串而不檢查它所複製的快取的容積導致的快取溢位問題。