谈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流读入。。。

            

               



C文件操作的语言fgets()的更多相关文章

  1. C语言 文件操作8--fputs()和fgets()

    //fputs()和fgets() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...

  2. Node.js文件操作一

    Node.js和其他语言一样,也有文件操作.先不说node.js中的文件操作,其他语言的文件操作一般也都是有打开.关闭.读.写.文件信息.新建删除目录.删除文件.检测文件路径等.在node.js中也是 ...

  3. C语言文件操作相关函数

    在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...

  4. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  5. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  6. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  7. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  8. Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释

     上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  9. 关于C语言文件操作

    关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...

随机推荐

  1. 【转】[Mysql] Linux Mysql 日志专题

    原文链接:http://blog.csdn.net/xiaoxu0123/article/details/6258538 1, 设置存放的目录: [root@Linux etc]# more /etc ...

  2. mysql中IN和EXITS效率

    mysql中的in语句是把外表和内表作hash 连接.而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都觉得exists比in语句的效率要高.这样的说法事实上是不准 ...

  3. 安装DBMS_SHARED_POOL包

    在安装10g gc的时候,会遇到The DBMS_SHARED_POOL package is not executed on the Existing Database这样的一个错误,意思是提示你D ...

  4. 总线接口与计算机通信(二)SPI总线

    SPI总线协议及SPI时序图详解  : http://blog.163.com/sunshine_linting/blog/static/44893323201181482335951/ 浅谈SPI总 ...

  5. WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

    原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...

  6. solr总结 第六部分:solr查询语法

    1.基本查询语法 q:全文查询.schema.xml里面定义了如下两块.eg q=ibm即表示org_name或者org_weisite里面出现ibm的document都可以被匹配到.KeyWords ...

  7. 为什么函数式编程在Java中很危险?

    摘要:函数式编程这个不温不火的语言由来已久.有人说,这一年它会很火,尽管它很难,这也正是你需要学习的理由.那么,为什么函数式编程在Java中很危险呢?也许这个疑问普遍存在于很多程序员的脑中,作者Ell ...

  8. 立波 iphone3gs越狱教程:成功把iphone3gs手机升级成ios6.1.3系统,完美越狱,解决no service和耗电量大的问题

    前几天,老婆使用的iphone3gs摔地了,把手机里的连接电源的那个神马线给搞坏了,结果花了200多块大洋修好了: 修好后,老婆抱怨道:5年了,这手机好多软件都装不上,说手机版本号太低了, 我就说凑合 ...

  9. QT调用CURL

    QProcess *mProcess; QStringList arguments; arguments<<"--disable-epsv" <<" ...

  10. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...