文件流中读行的正确使用(fgets、feof、ferror)
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)相关推荐
- java 一行行读取文件_Java中按行读取文件
本文译自Java read a file line by line – How Many Ways? 转载请注明出处. Java中的I/O类非常多,什么时候该用什么类经常让人困惑.下面两段代码展示了如 ...
- 【原】Mac下统计任意文件夹中代码行数的工具——cloc
这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...
- cloc JAVA文件_Mac下统计任意文件夹中代码行数的工具——cloc
这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按 ...
- java将多个文件写入到一个文件流中再有规律的取出_编写java程序,往一个txt文件里写入学生的基本信息,然后再读出这些信息并打印出来,最后把该文件拷贝到指...
满意答案 azonyb 2014.02.18 采纳率:59% 等级:12 已帮助:13223人 import java.io.BufferedInputStream; import java.i ...
- C语言中的文件是流式文件吗,c语言文件流
fopen() 功能:打开流 fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能:为使用而打开一个流,把一 ...
- C#中数据流(文件流、内存流、网络流等)相关知识点梳理
基本概念 C#中数据流的应用体现在方方面面,现在针其常用的几种类进行一次梳理. 数据流包括文件流(FileStream).内存流(MemoryStream).网络流(NetworkStream)以及读 ...
- SQL Server中的文件流
This article will discuss SQL Server FILESTREAM including installation, configuration, enabling and ...
- c语言 文件流 输出数据类型,总结C++中输入输出流及文件流操作
当程序员在编写程序的时候,最不可分割的是对文件做的相应的操作,总结C++中输入输出流及文件流操作大家都了解吗?想要了解的朋友,就随爱站技术频道小编来看看吧. 1.流的控制 iomanip ...
- C0301 代码块{}的使用,重定向, 从文件中读取行
#!/bin/bash # 从 /etc/fstab 中读行 File=/etc/fstab { read line1 read line2 } < $File # {}代码块, ...
最新文章
- 使用STC8H1K的高级PWM的正交编码器计数方式
- VTK:几何对象之ColoredLines
- 43行代码AC——例题6-8 树(Tree,UVa 548)——解题报告
- zuul转发的一些常见异常
- UML-based workflow |wfmc|面向对象的概念
- 【声学基础】概述——振动学
- [九度][何海涛] 二叉树中和为某一值的路径
- 利用 Google Chart API 生成二维码大小不一致
- 诺基亚n9支不支持java_诺基亚N9支持720p播放吗
- OFD文件是什么?如何将ofd转成PDF格式?
- MacOS Mojave 安装 AI 東北きりたん 东北切蒲英 NEUTRINO 教程
- 大数据平台以及一些核心组件介绍
- ESXi主机 TPM 证明警报
- 转自【AI科技评论】专访李海洲教授 | 机器智能对话是毕生所求
- stm32f4定时器时钟频率/选择
- 招商银行信用卡中心笔试编程题 - 小招喵跑步
- 求含n个元素的集合的幂集
- 【问】默认实例名是多少?
- vue打包上线并清除缓存机制
- oracle 本地磁盘使用率,Windows 7磁盘配置使用技巧提高磁盘使用率