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

    来说一说fgets(..)函数.     原型  char *  fgets(char * s, int n,FILE *stream);     参数:          s: 字符型指针,指向存储 ...

  2. C语言文件操作函数大全(看到总结的真的很好,就转载贡献给大家了)

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

  3. 基于存储的C语言文件操作常规问题分析(文本文件与二进制文件)

    基于存储的C语言文件操作常规问题分析(文本文件与二进制文件) 问题描述 文本文件与二进制文件 数据写入文本乱码问题 fopen和open 流式文件操作常用函数 直接I/O文件操作常用函数 问题描述 我 ...

  4. c语言创建文件存放,C语言文件操作

    C语言文件操作 常见硬件设备所对应的文件 文件 硬件设备 stdin 标准输入文件,一般指键盘:scanf().getchar() 等函数默认从 stdin 获取输入. stdout 标准输出文件,一 ...

  5. ❤️学懂C语言文件操作读这篇就够了(万字总结,附习题)❤️

    目录 ​​​ 一,写在前面 二,为什么使用文件 1,原因 2,数据流 3,缓冲区(Buffer) 4,C语言中带缓冲区的文件处理 5,文件类型 6,文件存取方式 三,什么是文件 1,程序文件 2,数据 ...

  6. c语言文件资源,C语言文件操作

    C语言文件操作 1第八章 文件v文件系统 概述v标准文件操作2.文件 文件是存储在外部存储介质上的信息的集合.每个文件有唯一的文件名(主名.后缀)来标识. 计算机实现按名对文件进行读.写等有关操作.广 ...

  7. C语言——文件操作(2)文件的读写操作

    之前,我讲解了文件的基本情况与读写模式,看到这篇博客的小伙伴们先参考这篇博客: C语言--文件操作详解(1)_ 接下来,我会继续讲解文件操作的第二大步:文件读/写操作. 目录 A.文件的顺序读写 一. ...

  8. 【Linux】基础IO-回顾C语言文件操作

    文章目录 回顾C语言文件操作 打开方式: 写文件 读文件 C++风格的文件读写 关于三个流 什么是当前路径 回顾C语言文件操作 C语言的文件操作如下: 文件操作函数 功能 fopen 打开文件 fcl ...

  9. c语言实验报告《文件操作》,c语言文件操作总结.docx

    C语言文件操作总结 File manipulation function File on / off FILE, *infile, =fopen ("ride? in"," ...

最新文章

  1. RSA签名算法,计算调用加密报文,安全传输
  2. ../include/my_global.h:1107: 错误:对 C++ 内建类型‘bool’的重声明
  3. MySQL 可重复读,差点背上一个 P0 事故!
  4. DevExpress 里实现单选按钮
  5. SAP Spartacus 会使用 Session timeout 吗?
  6. 《信息存储与管理》读书笔记7 存储虚拟化
  7. mft文件记录属性头包括_关于NTFS-MFT
  8. 【渝粤教育】 国家开放大学2020年春季 2064管理学基础 参考试题
  9. WEB攻防实战篇,思维导图
  10. R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...
  11. jquery查找父窗体id_Vue父组件获取子组件中的变量
  12. puppet成长日记四 Exec资源详细介绍及案例分析
  13. python用时间戳给文件命名规则_关于时间戳:python复制文件但保持原始
  14. 反射的学习(参考尚硅谷视频)
  15. ISO27001测试题
  16. 从键盘输入若干个学生成绩,计算出平均成绩。
  17. maven项目中JRE System Library Problem J2SE-1.5问题
  18. 生物化学 药物设计与研发笔记:变构(Allostery)药物设计
  19. CF 192 DIV.2
  20. 365天挑战LeetCode1000题——Day 096 消失的两个数字 子串能表示从 1 到 N 数字的二进制串 检查数组是否存在有效划分

热门文章

  1. 遥感影像识别-制作数据集
  2. U-Mail邮件服务器软件的四大优势
  3. PAT_乙级1012
  4. 既生synchronized,何生volatile (synchronized与volatile的区别)
  5. Swarm管理Docker集群
  6. [RK3588-Android12] 双HDMI+喇叭Speak同音问题
  7. 如何实现国外域名调转到国内已备案ip
  8. 到移动开发大会 听《植物大战僵尸》成功秘诀
  9. 码农三十岁之后过上了怎么的生活?
  10. 震惊!这个链接里面竟然有