fgets 订阅
fgets函数功能为从指定的流中读取数据,每次读取一行。其原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。 [1] 展开全文
fgets函数功能为从指定的流中读取数据,每次读取一行。其原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。 [1]
信息
外文名
fgets
函数使用
键盘输入fgets(buf,n,stdin)
头文件
stdio.h
中文名
fgets
功    能
读取数据
长    度
n-1个字符的字符串
fgetsfgets函数语法
char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。 [2]  如果文件中的该行,不足n-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回stream,失败或读到文件结尾返回NULL。因此不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。
收起全文
精华内容
下载资源
问答
  • 主要介绍了C语言中fgets和fscanf区别详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
  • 主要介绍了详解C语言gets()函数与它的替代者fgets()函数的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets()。他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输入多个数据域。 scanf函数是一个标准...
  • fgets

    万次阅读 2016-12-24 12:51:12
    原型 char * fgets(char * s, int n,FILE *stream);  参数:  s: 字符型指针,指向存储读入数据的缓冲区的地址。  n: 从流中读入n-1个字符  stream : 指向读取的流。  返回值:  1. 当n ...

    原型  char *  fgets(char * s, int n,FILE *stream);

        参数:

             s: 字符型指针,指向存储读入数据的缓冲区的地址。

             n: 从流中读入n-1个字符

             stream : 指向读取的流。

       返回值:

              1. 当n<=0 时返回NULL,即空指针。

              2. 当n=1 时,返回空串"".

              3. 如果读入成功,则返回缓冲区的地址。

              4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

              看看这个函数的官方说明:

                           /*** 
                        *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: 
                        * 
                        *******************************************************************************/ 

                标准库中fgets(...)的实现:

                

    [cpp]  view plain  copy
     
      在CODE上查看代码片 派生到我的代码片
    1. /****************************************************  
    2.  char *fgets(char *s, int n,  FILE *stream)  
    3.    {  
    4.      register int c;  
    5.      register char *cs;  
    6.      cs=s;  
    7.      while(--n>0 &&(c = getc(stream))!=EOF)  
    8.      if ((*cs++=  c) =='\n')  
    9.            break;  
    10.      *cs ='\0';  
    11.      return (c == EOF && cs == s) ?NULL :s ;  
    12.     }  
    13.   
    14. /********************************************************  



           在用fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。

            example:

                  char s[100]; //可以。

                  char *s;  //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。

            所以,如果要用指针,则  char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100];      如果为分配内存空间,编译时不会检查出问题,但运行时会出现未知错误。。

            fgets(...)读入文本行时的两种情况。

              1.如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。

               example:

                  123abc

                  fgets(s,10,fp);

                  此时,读入七个字符,123abc\n,实际上还有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。

              2.如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.

              example:

                123abc

                char  s[5];

                fgets(s,5,fp);

                这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.

           fgets(...)读入整个文件内容

              通常用while()循环来使fges()读入文本全部内容,并按行读入。

              

    [cpp]  view plain  copy
     
      在CODE上查看代码片 派生到我的代码片
    1. char s[1024];  
    2.            while((fgets(s,1024,fp))!=NULL)  
    3.             {  
    4.                   printf(s);  
    5.             }  

             当然如果n小于每行的字符个数,也可以读,只不过读的次数要多。

              假设一行为 : 123456789

              

    [cpp]  view plain  copy
     
      在CODE上查看代码片 派生到我的代码片
    1. char s[2];  
    2.           int  num=0;  
    3.           while((fgets(s,2,fp))!=NULL)  
    4.             {  
    5.                  printf(s);  
    6.                  n++;  
    7.             }  

              每次读入一个字符, 最后也会读完一行,num=10,读了十次,所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要是文本流没关闭。

             读入空行的情况:

                第一行   abcdef123

                第二行                       

                第三行  helloworld

                其中第二行为空,fget(..)会把第二行也读入,因为并未到文件结尾。

                有时我们并不需要空行,可以这样做。

              

    [cpp]  view plain  copy
     
      在CODE上查看代码片 派生到我的代码片
    1. while((fgets(s,n,fp))!=NULL)  
    2.              {  
    3.                   if(strlen(s)!=1)    //注意这儿是1不是0,因为尽管是空行,它也会读入换行符,strlen(s)=1;  
    4.                       printf(s);  
    5.              }  

             fgets(...)从标准设备读数据。

                用fgets(...)还也读入标准输入设备(一般为键盘)的信息

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

                假设在控制台下,我们可以用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,因为不会像gets()有溢出的可能。。

                比如 :输入 abc

                fgets(s,n,stdin)也会读入n-1个字符。但是只是从stdin流读入。。。

    展开全文
  • fgets函数用法

    2013-03-20 19:09:38
    详细描述了fgets函数的用法,该函数可读取文件中的字符串,可供C/CPP开发人员参考。
  • fgets函数

    万次阅读 多人点赞 2015-01-12 15:18:20
    在《征服C指针》中很少用到scanf()函数,而是使用fgets函数和sscanf函数的组合,于是仔细看了下fgets函数的用法。  char *fgets(char *s, int size, FILE *stream);  fgets() reads in at most one less than...

    在看《征服C指针》时的一些问题的汇总。

    1.fgets函数

    在《征服C指针》中很少用到scanf()函数,而是使用fgets函数和sscanf函数的组合,于是仔细看了下fgets函数的用法。

     char *fgets(char *s, int size, FILE *stream);
           fgets()  reads  in  at most one less than size characters from stream and stores them
           into the buffer pointed to by s.  Reading stops after an EOF or a newline.  If a new-
           line  is read, it is stored into the buffer.  A '\0' is stored after the last charac-
           ter in the buffer.

    函数原型:

    char *fgets(char *buf, int bufsize, FILE *stream);

    参数:

    *buf: 字符型指针,指向用来存储所得数据的地址。

    bufsize: 整型数据,指明存储数据的大小。

    *stream: 文件结构体指针,将要读取的文件流。

    光看上面的说明还是不太明白fgets函数的细节问题,通过一些测试例子给出说明。

    </pre><pre name="code" class="cpp">#define N 10 //定义缓冲区的最大长度是10
    int main()
    {
    	char buf[N]={0};
    	int i=0;
    	while(fgets(buf, N, stdin)) {//从标准输入中读取一行数据到缓冲区buf中
    		
    		//打印出读取的次数,输入的字符串,字符串的长度,并且手动添加了换行符
    		fprintf(stdout, "time i:%d\ninput string:%s\nlength:%d\n", i, buf, strlen(buf));
    		
    		//将字符串中的每一个字符输出,即输出字符的十进制表示,也输出字符形式
    		for (int j=0;j<strlen(buf);j++)
    		{
    			printf("buf[%d]:%d %c\n",j,buf[j],buf[j]);
    		}
    		i++;
    	}
    	return 0;
    }

    运行程序,最开始时下面这个等待输入的界面:


    往里面输入12345并按回车键,会输出下面的内容:


    这里需要注意下面几点:

    1:最上面的12345是手动输入的,点击回车后出现了下面几行,光标跳转到了最下面。这里面多出现了两个换行符,换行符1和换行符2,(图中用红线标注的)。

    这是由于输入12345并按下回车后fgets函数既读取了12345也读取了回车换行这个字符,所以在输出时将回车一起输出了,这样就出现换行符1,使用strlen函数求取buf的长度是6也就很好理解了。

    2:打印输出buf的内容时,for循环里使用的是strlen(buf),而不是使用定义buf这个数组时给数组指定的长度N。这是由于指定N只是定义了buf可以使用的最大字符长度,但是buf只存储少量字符也是可以的,这种情况下后面的字符算是无效的字符了,也就没有必要进行处理了。for循环里的strlen(buf)替换成N,打印出buf缓存区中的所有内容如下:

    		//将字符串中的每一个字符输出,即输出字符的十进制表示,也输出字符形式
    		for (int j=0;j<N;j++)
    		{
    			printf("buf[%d]:%d %c\n",j,buf[j],buf[j]);
    		}



    从上面可以一面了然的看出buf缓冲区中的前五个字符分别是'1','2','3','4','5','\n'(回车换行符,它的十进制表示是10),然后从第七个字符开始全部变成了空字符,空字符在ANSIC码中的十进制表示是0,字符形式是'\0',在屏幕上就是什么都不会显示。所以可以使用十进制或字符形式来判断一个字符串是否结束。至于为什么第8,9,10个字符也是空字符,这是由于buf数组初始化时是使用空字符来初始化的:

    char buf[N]={0};
    如果将上面的代码替换成只声明数组,并不用空字符来初始化:

    	char buf[N];
    
    输出如下:

    如果数组不初始化,这个就很明显了,前6个字符是从标准输入中输入的字符,然后第7个字符是字符串结束符空字符'\0',至于buf缓存区中剩下的就是未知的了,所以只需要处理strlen(buf)长度的字符串就可以了。

    从上面可以看出局部变量(即在栈中分配内存的变量初始的值是未知的,所以需要手动对它们进行初始化)

    char buf[N]={0};
    以下是这四种不同初始化方式并打印输出的结果:从下面的测试可以看出使用数组时应该怎么进行合适正确的初始化工作,不对其进行初始化是不对的,但是对其初始化也不要弄错了。

    方式1:不初始化数组,结果未知

    	char buf[N];
    
    	for (int j=0;j<N;j++)
    	{
    		printf("buf[%d]:%d %c\n",j,buf[j],buf[j]);
    	}

    方式2:使用0来初始化数组
    	char buf[N]={0};
    
    	for (int j=0;j<N;j++)
    	{
    		printf("buf[%d]:%d %c\n",j,buf[j],buf[j]);
    	}

    方式3:使用'\0'来初始化数组,方式2和方式3其实是一样的。

    char buf[N]={'\0'};
    
    	for (int j=0;j<N;j++)
    	{
    		printf("buf[%d]:%d %c\n",j,buf[j],buf[j]);
    	}

    方式4:使用'0'来初始化数组,这是使用字符‘0’来初始化数组,48是字符0对应的ANSIC码

    	char buf[N]={'0'};
    
    	for (int j=0;j<N;j++)
    	{
    		printf("buf[%d]:%d %c\n",j,buf[j],buf[j]);
    	}


    前面进行测试时输入的一直是"12345"和回车换行这6个字符,但是缓冲区buf的大小是10个,那么当输入的字符数到10时会发生什么情况?现在测试输入"123456789"并按回车后的结果。



    从上面的结果可以看出,当输入"123456789"并按回车,这时外部输入了10个字符,但是由于buf缓冲区中只能容纳10个字符,并且这10个字符中还包括字符串结束符‘\0’,也就是说当外部输入达到10个时,它第一次只读取了9个字符,也就是"123456789",buf缓冲区中第10个位置存放字符串结束符'\0',此时还有一个回车换行符没有被读取会再次进入循环,然后读取这个回车换行字符,所以第二次读取时buf[0]的值为10(即回车换行符的ANSIC码),然后跟着一个空字符表示字符串的结束。并且第3个位置到第10个位置的值也很有意思,就是上一次buf的值。

    从上面可以看出buf中至少会有一个字符,就是回车换行字符。即使标准输入中什么也不输入,但是点击回车换行时这个字符也会保存在buf中。


    2.getchar函数

    这个函数的原型是:

    int getchar(void);

    说明如下:

    getchar 由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

    针对上面的说明,做了个很简单但感觉很有意思的测试.。

    int main(){
    	putchar(getchar());
    	//putchar(getchar());
    	//putchar(getchar());
    	return 0;
    }

    运行,输入1并按回车:


    发现就是打印出了输入的1,并没有打印回车换行符。然后将上面的第一行注释给去掉:

    int main(){
    	putchar(getchar());
    	putchar(getchar());
    	//putchar(getchar());
    	return 0;
    }
    再次运行,输入1并按回车:


    发现多输出了一个换行符,就是第二个putchar(getchar())接收到了回车换行的输入,如果把最下面的注释也给去掉,运行结果如下:


    发现又是等待输入的界面。

    从上面的三次测试中可以很好理解对getchar函数的那段说明。首先用户的输入(包括回车换行符)被放在缓冲区中,只有键入回车之后才开始从这个缓冲区中读取字符,然后如用户在按回车之前输入了不止一个字符(其实输入一个字符也会有回车换行符保存在缓冲区吧?),其他字符会保留在键盘缓存区中,等待后续getchar调用读取,从使用两个getchar的测试中可以看出其它字符保存在缓冲区中,所以第二个getchar直接取得了回车换行符而没有等待用户输入,当使用三个getchar时由于缓冲区中只有两个字符,一个'1',一个回车换行符都读取完了,所以又进入了等待用户输入的界面。

    展开全文
  • fgets_fgets_源码

    2021-10-04 08:29:55
    Implementation of fgets file handling function in c.
  • fgets 函数用法

    万次阅读 多人点赞 2019-07-22 16:40:35
    来说一说fgets(..)函数。 原型 char * fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针,指向存储读入数据的缓冲区的地址。 n: 从流中读入n-1个字符 stream : 指向读取的流。 返回值: 1...

       来说一说fgets(..)函数。

        原型  char *  fgets(char * s, int n,FILE *stream);

        参数:

             s: 字符型指针,指向存储读入数据的缓冲区的地址。

             n: 从流中读入n-1个字符

             stream : 指向读取的流。

       返回值:

              1. 当n<=0 时返回NULL,即空指针。

              2. 当n=1 时,返回空串"".

              3. 如果读入成功,则返回缓冲区的地址。

              4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

              看看这个函数的官方说明:

                           /*** 
                        *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: 
                        * 
                        *******************************************************************************/ 

                标准库中fgets(...)的实现:

                 /****************************************************

                  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(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。

            example:

                  char s[100]; //可以。

                  char *s;  //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。

                  所以,如果要用指针,则  char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100];      如果为分配内存空间,编译时不会检查出问题,但运行时会出现未知错误。。

            fgets(...)读入文本行时的两种情况。

              1。    如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。

               example:

                  123abc

                  fgets(s,10,fp);

                  此时,读入七个字符,123abc\n,实际上还有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。

              2.     如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.

              example:

                123abc

                char  s[5];

                fgets(s,5,fp);

                这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.

           fgets(...)读入整个文件内容

              通常用while()循环来使fges()读入文本全部内容,并按行读入。

               char s[1024];

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

                 {

                       printf(s);

                 }

             当然如果n小于每行的字符个数,也可以读,只不过读的次数要多。

              假设一行为 : 123456789

               char s[2];

               int  num=0;

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

                 {

                      printf(s);

                      n++;

                 }

                每次读入一个字符, 最后也会读完一行,num=10,读了十次,所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要是文本流没关闭。

             读入空行的情况:

                第一行   abcdef123

                第二行                       

                第三行  helloworld

                其中第二行为空,fget(..)会把第二行也读入,因为并未到文件结尾。

                有时我们并不需要空行,可以这样做。

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

                   {

                        if(strlen(s)!=1)    //注意这儿是1不是0,因为尽管是空行,它也会读入换行符,strlen(s)=1;

                            printf(s);

                   }

             fgets(...)从标准设备读数据。

                用fgets(...)还也读入标准输入设备(一般为键盘)的信息

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

                假设在控制台下,我们可以用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,因为不会像gets()有溢出的可能。。

                比如 :输入 abc

                fgets(s,n,stdin)也会读入n-1个字符。但是只是从stdin流读入。。。

                

    转载于:https://www.cnblogs.com/coder-jhm1314/articles/4561006.html

    展开全文
  • fgets与fputs函数

    2015-03-04 14:45:34
    fgets函数详解 fgets函数 从流中读一行或指定个字符,  原型是char *fgets(char *s, int n, FILE *stream);  从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。...
  • 来说一说fgets(..)函数。     原型  char *  fgets(char * s, int n,FILE *stream);     参数:          s: 字符型指针,指向存储读入数据的缓冲...

    来说一说fgets(..)函数。

        原型  char *  fgets(char * s, int n,FILE *stream);

        参数:

             s: 字符型指针,指向存储读入数据的缓冲区的地址。

             n: 从流中读入n-1个字符

             stream : 指向读取的流。

       返回值:

              1. 当n<=0 时返回NULL,即空指针。

              2. 当n=1 时,返回空串"".

              3. 如果读入成功,则返回缓冲区的地址。

              4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

              看看这个函数的官方说明:

                           /*** 
                        *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: 
                        * 
                        *******************************************************************************/ 

                标准库中fgets(...)的实现:

                 /****************************************************

                  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(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。

            example:

                  char s[100]; //可以。

                  char *s;  //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。

                  所以,如果要用指针,则  char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100];      如果为分配内存空间,编译时不会检查出问题,但运行时会出现未知错误。。

            fgets(...)读入文本行时的两种情况。

              1。    如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。

               example:

                  123abc

                  fgets(s,10,fp);

                  此时,读入七个字符,123abc\n,实际上还有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。

              2.     如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.

              example:

                123abc

                char  s[5];

                fgets(s,5,fp);

                这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.

           fgets(...)读入整个文件内容

              通常用while()循环来使fges()读入文本全部内容,并按行读入。

               char s[1024];

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

                 {

                       printf(s);

                 }

             当然如果n小于每行的字符个数,也可以读,只不过读的次数要多。

              假设一行为 : 123456789

               char s[2];

               int  num=0;

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

                 {

                      printf(s);

                      n++;

                 }

                每次读入一个字符, 最后也会读完一行,num=10,读了十次,所以,fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要是文本流没关闭。

             读入空行的情况:

                第一行   abcdef123

                第二行                       

                第三行  helloworld

                其中第二行为空,fget(..)会把第二行也读入,因为并未到文件结尾。

                有时我们并不需要空行,可以这样做。

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

                   {

                        if(strlen(s)!=1)    //注意这儿是1不是0,因为尽管是空行,它也会读入换行符,strlen(s)=1;

                            printf(s);

                   }

             fgets(...)从标准设备读数据。

                用fgets(...)还也读入标准输入设备(一般为键盘)的信息

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

                假设在控制台下,我们可以用fgets(...)替代gets(),读入键盘输入的信息,fgets()是安全的,因为不会像gets()有溢出的可能。。

                比如 :输入 abc

                fgets(s,n,stdin)也会读入n-1个字符。但是只是从stdin流读入

    转自:http://blog.csdn.net/daiyutage/article/details/8540932

    展开全文
  • fgets和read区别

    2021-06-25 00:05:34
    char string[20]; int main() { write(1, ">... fgets(string, sizeof string, stdin); printf("%s\n", string); printf("sizeof: %ld \n", sizeof string); for (int i = 0; i < sizeof string; i
  • I C 函数 fopen 打开文件 II C 函数 fprintf 写出文件 ...IV C 函数 fgets 读取文件 ( 遇到换行结束) V C 函数 fputc 写出单个字符 VI C 函数 fgetc 读取单个字符 VII C++ IO 流 VIII 文件操作代码示例
  • C语言文件操作中 fgets、fputs 函数详解 先给出api fgets 语法: #include char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num – 1]个字符并且把它们转储到str(字符串)中....
  • 但是 gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,gets 无法检测到这个问题,就会发生内存越界,所以编程时建议使用 fgets()。...
  • 这篇文章要探讨的是“fgets()函数的详解以及使用时需要注意的一些细节”。涉及fgets()函数的应用和需要注意的问题。属于C语言基础篇(持续更新)。 fgets()(函数原型:char *fgets(char *restrict str, int size, ...
  • 关于fgets函数的feof的问题注意事项读取配置文件,过滤掉以#开头的注释行和空行。 关于fgets函数的feof的问题 我们在这里说明的目的就是读者在以后的开发过程中不要使用feof函数来作为结束判断。 我们来查看fgets中...
  • fgets实现

    千次阅读 2018-09-17 13:18:06
    char *fgets(char *s, int n, FILE *stream) { register int c; register char *cs; cs = s; while(--n &gt; 0 &amp;&amp; (c = getc(stream)) != EOF) { if((*cs++ = c) == '\n') {...
  • I have looked all over, and I still can't find a reason as to why <code>fgets()</code> keeps returning <code>NULL</code>. <pre><code>void sorter(char *fileName, char *directory, char* newName){ ...
  • C语言的字符串输入fgets()函数

    千次阅读 2020-06-26 21:18:51
    C语言的字符串输入fgets()函数 fgets()函数简介 读字符串函数fgets()的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针),要从键盘输入时文件指针的参数为:...
  • 函数名:fgets  功能:从流中读取一个字符串  用法:char *fgets(char *string,int n,FILE *stream);  形参注释:  *string:结果数据的首地址;n-1:读入数据块的长度,其默认值为1k,即1024;stream文件...
  • fgets(line,(sizeof line / sizeof line[0]),stdin);//这一句代码是什么意思? for(i=0; line[i] !='\0'; i++) { while (!((line[i] >= 'a' && line[i] ) || (line [i] >= 'A' && line[i] ) || line[i]=='\0...
  • fgets函数与gets函数

    2021-09-19 09:31:07
    char* fgets(char *s, int n, FILE stream); char gets(char *s); 可见fgets要传入参数n,即读入多少个字符,而gets并没有这个限制。在这里显而易见,fgets读入多少字符我们自己传参,不会造成越界的问题。但是gets...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,457
精华内容 26,582
关键字:

fgets