fgets()函數(shù)原型如下“
char* fgets(char* s int n, FILE* stream)
參數(shù):
s: 字符型指針,指向存儲(chǔ)讀入數(shù)據(jù)的緩沖區(qū)的地址。
n: 從流中讀入n-1個(gè)字符
stream : 指向讀取的流。
返回值:
1. 當(dāng)n<=0 時(shí)返回NULL,即空指針。
2. 當(dāng)n=1 時(shí),返回空串''.
3. 如果讀入成功,則返回緩沖區(qū)的地址。
4. 如果讀入錯(cuò)誤或遇到文件結(jié)尾(EOF),則返回NULL.
看看這個(gè)函數(shù)的官方說(shuō)明:
/***
*char *fgets(string, count, stream) - input string from a stream
*
*Purpose:
* get a string, up to count-1 chars or '\n', whichever comes first,
* append '\0' and put the whole thing into string. the '\n' IS included
* in the string. if count<=1 no input is requested. if EOF is found
* immediately, return NULL. if EOF found after chars read, let EOF
* finish the string as '\n' would.
*
*Entry:
* char *string - pointer to place to store string
* int count - max characters to place at string (include \0)
* FILE *stream - stream to read from
*
*Exit:
* returns string with text read from file in it.
* if count <= 0 return NULL
* if count == 1 put null string in string
* returns NULL if error or end-of-file found immediately
*
*Exceptions:
*
*******************************************************************************/
標(biāo)準(zhǔn)庫(kù)中fgets(...)的實(shí)現(xiàn):
在用fgets(..)讀入數(shù)據(jù)時(shí),先定義一個(gè)字符數(shù)組或字符指針,如果定義了字符指針 ,那么一定要初始化。
example:
char s[100]; //可以。
char *s; //不可以,因?yàn)橹皇锹暶髁艘粋€(gè)指針。但并沒(méi)有為它分配內(nèi)存緩沖區(qū)。
所以,如果要用指針,則 char *s=(char *)malloc(100*sizeof(char)); 為其分配內(nèi)存空間,c++中用char *s=new char [100]; 如果為分配內(nèi)存空間,編譯時(shí)不會(huì)檢查出問(wèn)題,但運(yùn)行時(shí)會(huì)出現(xiàn)未知錯(cuò)誤。。
fgets(...)讀入文本行時(shí)的兩種情況。
1.如果n大于一行的字符串長(zhǎng)度,那么當(dāng)讀到字符串末尾的換行符時(shí),fgets(..)會(huì)返回。并且在s的最后插入字符串結(jié)束標(biāo)志'\0'。 而s緩沖區(qū)剩余的位置不會(huì)再填充。
example:
123abc
fgets(s,10,fp);
此時(shí),讀入七個(gè)字符,123abc\n,實(shí)際上還有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。
2.如果n小于等于一行的字符串的長(zhǎng)度,那么讀入n-1個(gè)字符,此時(shí)并沒(méi)有讀入\n因?yàn)椴](méi)有到行尾 ,同樣在最后會(huì)插入'\0'.
example:
123abc
char s[5];
fgets(s,5,fp);
這時(shí)讀入4個(gè)字符,123a,并沒(méi)有換行符,所以strlen(s)=4.
fgets(...)讀入整個(gè)文件內(nèi)容
通常用while()循環(huán)來(lái)使fges()讀入文本全部?jī)?nèi)容,并按行讀入。
當(dāng)然如果n小于每行的字符個(gè)數(shù),也可以讀,只不過(guò)讀的次數(shù)要多。
假設(shè)一行為 : 123456789
每次讀入一個(gè)字符, 最后也會(huì)讀完一行,num=10,讀了十次,所以,fgets若沒(méi)遇到換行符,會(huì)接著從前一次的位置繼續(xù)讀入n-1個(gè)字符,只要是文本流沒(méi)關(guān)閉。
讀入空行的情況:
第一行 abcdef123
第二行
第三行 helloworld
其中第二行為空,fget(..)會(huì)把第二行也讀入,因?yàn)椴⑽吹轿募Y(jié)尾。
有時(shí)我們并不需要空行,可以這樣做。
while((fgets(s,n,fp))!=NULL)
{
if(strlen(s)!=1) //注意這兒是1不是0,因?yàn)楸M管是空行,它也會(huì)讀入換行符,strlen(s)=1,此處1是因?yàn)? 換行符\n的長(zhǎng)度為1;
printf(s);
}
fgets(...)從標(biāo)準(zhǔn)設(shè)備讀數(shù)據(jù)。
用fgets(...)還也讀入標(biāo)準(zhǔn)輸入設(shè)備(一般為鍵盤(pán))的信息
原型 : fgets(s,n,stdin);
假設(shè)在控制臺(tái)下,我們可以用fgets(...)替代gets(),讀入鍵盤(pán)輸入的信息,fgets()是安全的,因?yàn)椴粫?huì)像gets()有溢出的可能。。
比如 :輸入 abc
fgets(s,n,stdin)也會(huì)讀入n-1個(gè)字符。但是只是從stdin流讀入。。。
聯(lián)系客服