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

功能

fgets函数用来从stream所指文件中读入bufsize-1个字符放入buf为起始地址的空间内;如果在未读满bufsize-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,调用fgets函数时,最多只能读入bufsize-1个字符。读入结束后,系统将自动在最后加’\0’,并以buf作为函数值返回。

返回值

  • 成功,则返回第一个参数buf;
  • 在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
  • 如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。

stream文件流指针体指向文件内容地址的偏移原则

  • 如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上’\n’),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。
  • 如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的’\n’换行,一个保存字符串本身的结束标识’\0’),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
int feof(FILE *stream);

功能
feof是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。

int ferror(FILE *stream);

功能
在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。如果ferror返回值为0,表示未出错。如果返回一个非零值,表示出错。
对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

例子

int main(void) {char line[256];FILE *f = fopen("1/2.txt", "rb");while (!feof(f)) {fgets(line, sizeof(line), f);printf("-%s", line);}fclose(f);return 0;
}

1.txt:

2.txt:

原因:
fgets在读取了sizeof(line)-1个字符、读到了’\n’或遇到了EOF三种情况之一时都结束读取。 2.txt多余的一行打印,是因为2.txt最后一行只有一个’\n’,fget读一个字节立即正常结束读取,此种情况下未更新line内容导致。

改进:

推荐写法:

int main(void) {char line[256];FILE *f = fopen("2.txt", "rb");while (!feof(f) && !ferror(f)) {strcpy(line, "\n"); fgets(line, sizeof(line), f);printf("-%s", line);}fclose(f);return 0;
}

文件流中读行的正确使用(fgets、feof、ferror)相关推荐

  1. java 一行行读取文件_Java中按行读取文件

    本文译自Java read a file line by line – How Many Ways? 转载请注明出处. Java中的I/O类非常多,什么时候该用什么类经常让人困惑.下面两段代码展示了如 ...

  2. 【原】Mac下统计任意文件夹中代码行数的工具——cloc

    这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...

  3. cloc JAVA文件_Mac下统计任意文件夹中代码行数的工具——cloc

    这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...

  4. java将多个文件写入到一个文件流中再有规律的取出_编写java程序,往一个txt文件里写入学生的基本信息,然后再读出这些信息并打印出来,最后把该文件拷贝到指...

    满意答案 azonyb 2014.02.18 采纳率:59%    等级:12 已帮助:13223人 import java.io.BufferedInputStream; import java.i ...

  5. C语言中的文件是流式文件吗,c语言文件流

    fopen() 功能:打开流 fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能:为使用而打开一个流,把一 ...

  6. C#中数据流(文件流、内存流、网络流等)相关知识点梳理

    基本概念 C#中数据流的应用体现在方方面面,现在针其常用的几种类进行一次梳理. 数据流包括文件流(FileStream).内存流(MemoryStream).网络流(NetworkStream)以及读 ...

  7. SQL Server中的文件流

    This article will discuss SQL Server FILESTREAM including installation, configuration, enabling and ...

  8. c语言 文件流 输出数据类型,总结C++中输入输出流及文件流操作

    当程序员在编写程序的时候,最不可分割的是对文件做的相应的操作,总结C++中输入输出流及文件流操作大家都了解吗?想要了解的朋友,就随爱站技术频道小编来看看吧. 1.流的控制 iomanip        ...

  9. C0301 代码块{}的使用,重定向, 从文件中读取行

    #!/bin/bash # 从 /etc/fstab 中读行 File=/etc/fstab {     read line1     read line2 } < $File # {}代码块, ...

最新文章

  1. 使用STC8H1K的高级PWM的正交编码器计数方式
  2. VTK:几何对象之ColoredLines
  3. 43行代码AC——例题6-8 树(Tree,UVa 548)——解题报告
  4. zuul转发的一些常见异常
  5. UML-based workflow |wfmc|面向对象的概念
  6. 【声学基础】概述——振动学
  7. [九度][何海涛] 二叉树中和为某一值的路径
  8. 利用 Google Chart API 生成二维码大小不一致
  9. 诺基亚n9支不支持java_诺基亚N9支持720p播放吗
  10. OFD文件是什么?如何将ofd转成PDF格式?
  11. MacOS Mojave 安装 AI 東北きりたん 东北切蒲英 NEUTRINO 教程
  12. 大数据平台以及一些核心组件介绍
  13. ESXi主机 TPM 证明警报
  14. 转自【AI科技评论】专访李海洲教授 | 机器智能对话是毕生所求
  15. stm32f4定时器时钟频率/选择
  16. 招商银行信用卡中心笔试编程题 - 小招喵跑步
  17. 求含n个元素的集合的幂集
  18. 【问】默认实例名是多少?
  19. vue打包上线并清除缓存机制
  20. oracle 本地磁盘使用率,Windows 7磁盘配置使用技巧提高磁盘使用率

热门文章

  1. 6位中国民间艺术家在美国纽约法拉盛图书馆庆猪年
  2. js阻止默认事件的两种方式
  3. 第 4 章 使用 CLI 命令管理 LVM
  4. 时间序列-ARIMA模型
  5. 请教关于reaver解pin 时的疑问
  6. xilinx Vivado的使用详细介绍(2):综合、实现、管脚约束、产生比特流文件、烧写程序、硬件验证
  7. 【原创】会声会影X8 64位安装完成后一打开就示已停止工作的解决办法
  8. 【MATLAB】1.基础语法 。等差数列;求积分、导数;num2str;分行,分号
  9. java 解压tgz文件
  10. 网易在美试乘FF91 贾跃亭的年终考核你给打多少分? | CES