乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      fgets()函數(shù)

       心本心123 2021-11-19

      fgets()函數(shù)原型如下“

      char*  fgets(char* s int n, FILE* stream)

      參數(shù):

               s: 字符型指針,指向存儲讀入數(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ù)的官方說明:

                             /*** 
                          *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)庫中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è)指針。但并沒有為它分配內(nèi)存緩沖區(qū)。

              所以,如果要用指針,則  char *s=(char *)malloc(100*sizeof(char)); 為其分配內(nèi)存空間,c++中用char *s=new char [100];      如果為分配內(nèi)存空間,編譯時(shí)不會檢查出問題,但運(yùn)行時(shí)會出現(xiàn)未知錯(cuò)誤。。

              fgets(...)讀入文本行時(shí)的兩種情況。

                1.如果n大于一行的字符串長度,那么當(dāng)讀到字符串末尾的換行符時(shí),fgets(..)會返回。并且在s的最后插入字符串結(jié)束標(biāo)志'\0'。 而s緩沖區(qū)剩余的位置不會再填充。

                 example:

                    123abc

                    fgets(s,10,fp);

                    此時(shí),讀入七個(gè)字符,123abc\n,實(shí)際上還有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。

                2.如果n小于等于一行的字符串的長度,那么讀入n-1個(gè)字符,此時(shí)并沒有讀入\n因?yàn)椴]有到行尾 ,同樣在最后會插入'\0'.

                example:

                  123abc

                  char  s[5];

                  fgets(s,5,fp);

                  這時(shí)讀入4個(gè)字符,123a,并沒有換行符,所以strlen(s)=4.

             fgets(...)讀入整個(gè)文件內(nèi)容

                通常用while()循環(huán)來使fges()讀入文本全部內(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ù),也可以讀,只不過讀的次數(shù)要多。

                假設(shè)一行為 : 123456789

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

                每次讀入一個(gè)字符, 最后也會讀完一行,num=10,讀了十次,所以,fgets若沒遇到換行符,會接著從前一次的位置繼續(xù)讀入n-1個(gè)字符,只要是文本流沒關(guān)閉。

               讀入空行的情況:

                  第一行   abcdef123

                  第二行                       

                  第三行  helloworld

                  其中第二行為空,fget(..)會把第二行也讀入,因?yàn)椴⑽吹轿募Y(jié)尾。

                  有時(shí)我們并不需要空行,可以這樣做。

      while((fgets(s,n,fp))!=NULL)  

      {     

          if(strlen(s)!=1)    //注意這兒是1不是0,因?yàn)楸M管是空行,它也會讀入換行符,strlen(s)=1,此處1是因?yàn)? 換行符\n的長度為1;                         

          printf(s);

      }
       


               fgets(...)從標(biāo)準(zhǔn)設(shè)備讀數(shù)據(jù)。

                  用fgets(...)還也讀入標(biāo)準(zhǔn)輸入設(shè)備(一般為鍵盤)的信息

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

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

                  比如 :輸入 abc

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


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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多