fgets
- 外文名
- fgets
- 功 能
- 標準輸出裝置自動刷清
- 函式使用
- 鍵盤輸入fgets(buf,n,stdin)
- 長 度
- 1 位元組的字串
- 標頭檔案
- stdio.h
函式 (ISO C)
編輯函式原型
char *fgets(char *buf, int bufsize, FILE *stream);
引數
*buf: 字元型指標,指向用來儲存所得資料的地址。
bufsize: 整型資料,指明儲存資料的大小。
*stream: 檔案結構體指標,將要讀取的檔案流。
返回值
-
成功,則返回第一個引數buf;
-
在讀字元時遇到end-of-file,則eof指示器被設定,如果還沒讀入任何字元就遇到這種情況,則buf保持原來的內容,返回NULL;
功能
注意:《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個字元
這個時候再執行fgets(str1,20,file1)則執行後str1 = " I Have\n"
而如果
fgets(str1,23,file1);
則執行str1="Love ,I Have",讀取了一行(包括行尾的'\n',並自動加上字串結束符'\0'),當前檔案位置移至下一行,雖然23大於當前行上字元總和,可是不會繼續到下一行。而下一次呼叫fgets()繼續讀取的時候是從下一行開始讀。
序例
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函式用來從檔案中讀入字串。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)-1]='\0'
還有種程式經常使用的方法:key[strlen(key-1)]=0x00;
與gets相比使用這個好處是:讀取指定大小的資料,避免gets函式從stdin接收字串而不檢查它所複製的快取的容積導致的快取溢位問題。