日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

fgets()函數(shù)

 心本心123 2021-11-19

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):

/**************************************************** /     char  *fgets( char  *s,  int  n,   FILE  *stream)  
   {  
    register   int  c;  
    register   char  *cs;  
      cs=s;  
      while (--n>0 &&(c = getc(stream))!=EOF)  
      if  ((*cs++=  c) == '\n' )  
            break ;  
     *cs = '\0' ;  
      return  (c == EOF && cs == s) ?NULL :s ;  
    }  

       在用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)容,并按行讀入。

[cpp]  view plain  copy  print ?
  1. char s[1024];  
  2.            while((fgets(s,1024,fp))!=NULL)  
  3.             {  
  4.                   printf(s);  
  5.             }  

         當(dāng)然如果n小于每行的字符個(gè)數(shù),也可以讀,只不過(guò)讀的次數(shù)要多。

          假設(shè)一行為 : 123456789

[cpp]  view plain  copy  print ?
char  s[2];  
int   num=0;  
while((fgets(s,2,fp))!=NULL)               
{
       printf(s);  
       n++;  
}  

          每次讀入一個(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è)備(一般為鍵盤)的信息

            原型  :  fgets(s,n,stdin);

            假設(shè)在控制臺(tái)下,我們可以用fgets(...)替代gets(),讀入鍵盤輸入的信息,fgets()是安全的,因?yàn)椴粫?huì)像gets()有溢出的可能。。

            比如 :輸入 abc

            fgets(s,n,stdin)也會(huì)讀入n-1個(gè)字符。但是只是從stdin流讀入。。。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多