来说一说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 语言文件操作

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

  2. C语言文件操作函数

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

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

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

  4. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  5. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  6. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  7. C语言文件操作解析(五)之EOF解析(转载)

      C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...

  8. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

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

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

随机推荐

  1. iPhone5C三大看点:性能不输iPhone5 或售3399元

    乐杨俊编辑修改转载: iPhone 5C的发售时间或最早在9月18日,抢在中秋节前:最迟至国庆十一假期期间. [IT商业新闻网综合讯](记者 林涛)苹果2013年秋季发布会还有几个小时即将开幕,除了i ...

  2. Appium 命令行启动配置

    Appium 安装过后,会有图形界面,同样也支持命令行参数的启动和配置 Windws: 在windows 安装配置Appium有三种方式: Node install -g appium .exe文件安 ...

  3. Oracle 的一张表没有主键,如何映射Hibernate

    我的一个Oracle表,没有任何主键,然后生成的时候就将所有的字段都作为联合主键,如果所有的字段都做联合主键的话,这样只要一个字段为null,查询的话这条记录就不能查询到. 然后我想到Oracle数据 ...

  4. 在linux下如何编译C++程序

    一.GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活.它可以通过不同的前端模块来支持各种语言,如Java.Fortran. ...

  5. MFC为应用程序添加托盘(右键托盘,弹出菜单)

    源代码:http://download.csdn.net/detail/nuptboyzhb/4137784 1.       导入一个托盘图标的资源(.ico)格式:资源ID为IDI_ICON1 2 ...

  6. JSP的学习(2)——语法知识一

    上一篇<JSP的学习>讲述了JSP的一些基础知识和底层原理,本篇将来学习JSP所需掌握的语法知识等. JSP的语法主要包括以下几个部分的内容: 1)         JSP模板元素 2)  ...

  7. Ubuntu 环境安装整理

    Ubuntu11.04下Java开发环境搭建和配置 转自:http://guoyunsky.iteye.com/blog/1175861 类似的搭建,网上一搜一大把,但每次去搜索比较麻烦.我这里就整理 ...

  8. [置顶] location.href你真的会用了?

    *.location.href 用法: top.location.href=”url”          在顶层页面打开url(跳出框架) self.location.href=”url”       ...

  9. JSTL解析——005——core标签库04

    直接入主题,标签讲解 1.<c:import>标签 JSP里面有<% file include="XX"%> 与<jsp:include>,JS ...

  10. 【免费】iPhone上最好用的短信群发软件: 高速短信4.1

    免费的最新的联系人.群组.多人发送短信软件短信群发4.1已经出炉.欢迎下载! *归属地信息让你时时记着好友的地方,让陌生号码变得不陌生:  *您能够选择最经常使用的联系人然后发送高速短信; *群联系人 ...