C++ IO 库条件状态及EOF
来源:互联网 发布:js给input文本框赋值 编辑:程序博客网 时间:2024/05/30 22:43
文本文件判空问题
对于空文本文件的判断问题引起了我对 IO 库中条件状态和 EOF 的探究。
就是这段程序:
int vehicle_number;fstream infile;infile.open("vehicle.txt", ios::in);if(infile.is_open()){ while(!infile.eof()) { infile >> vehicle_number; ...... } infile.close();}
它可以打开空文本文件并运行到 while(!infile.eof())
循环里面。由于是空文本文件,它进入里面会造成一些问题,所以需要对文件进行判空。
EOF
EOF(End Of File) 常用于:
- 文件结束标志
- 函数出错的返回值
在 C++ IO 库中可用作:
- 条件状态的判定
现在让我们看看 IO 库中的描述。
IO 库条件状态
【表一】IO 库条件状态
【表二】四种条件状态
我们先看【表一】的关于 EOF 的这两行:
这里指出当流读到文件结束时,eofbit
置 1
,用于标识读取到文件的末尾。
而 eof()
是当 eofbit
置位(置 1
)时才返回,并不是读到文件末尾就返回。
所以使用 eof()
读取文件,读到结束标志 EOF
时不会立刻返回 true
,只是 eofbit
置位,下次调用 eof()
才返回 true
。
文本文件判空问题的解释
现在就可以解释最初的问题了,让我们回过头看看。
当程序第一次运行到 while(!infile.eof())
时,infile.eof()
读到文件末尾的 EOF
,但并不是立刻返回 true
,只是 eofbit
置位,所以 infile.eof()
还是 false
的状态,所以会进入 while
循环。
文本文件判空问题的解决
把流对象状态当做条件使用
if(infile.is_open()){ while(infile >> vehicle_number) { ...... }}
使用
peek()
istream::peek()
用于读取并返回流的下一个字符(返回值为char
类型),但并不读取该字符到输入流中,即流指针依然指向原来位置,并不后移。if(infile.is_open()){ while(infile.peek() != EOF) { infile >> vehicle_number; ...... }}
重复读入非空文本文件最后一个字符问题
经过上面的解释,我们已经知道了文本文件如何判空。但由于 EOF 的锅,若用 while(!infile.eof())
还会导致重复读入非空文本文件最后一个字符的问题。
看下面这段代码:
char c;fstream infile;infile.open("test.txt", ios::in);if(infile.is_open()){ while(!infile.eof()) { infile >> c; cout << c; }}infile.close();
和文本文件判空问题的代码相似,只是读入字符存储到 char
类型变量中,并把其输出。
然后我们在 test.txt
中保存 abc
这三个字符。
运行的结果是:
abcc
即 while(!infile.eof())
重复执行了最后一趟,多输入了字符 c
。
这个问题和文本文件判空问题的解决办法一样,都是使用 peek()
或者把流对象当做 while
的条件来解决。
总结
- 使用
eof()
读取文件,读到结束标志EOF
时不会立刻返回true
,只是eofbit
置位,下次调用eof()
才返回true
。 - 只有一个流处于无错状态时,我们才可以对它读写数据。因此代码通常应该在使用一个流之前检查它是否处于良好状态。
我的博客:https://blog.huihut.com/
转载请注明出处:https://blog.huihut.com/2017/04/15/CppConditionStateAndEOF/
- C++ IO 库条件状态及EOF
- C++:IO流条件状态
- IO条件状态
- c++primer 第八章IO操控流的条件状态
- 初识io流条件状态
- 初识io流条件状态
- IO流的条件状态
- IO标准库管理一系列条件状态成员
- C++语言之标准io库条件状态
- Cpp Primer<<学习IO标准库--条件状态_5
- C++EOF
- 【C++ Primer】【学习笔记】【第八章】标准IO库之:条件状态
- 重温《C++ Primer》笔记二 标准IO库的条件状态
- Java.io.CharConversionException:EOF
- cin条件状态及break/continue
- C++笔记——io流条件状态
- java.io.CharConversionException:EOF异常
- 条件状态
- 一张图了解:前端性能优化
- 串口编程—(2)编程步骤及参数设置
- 01_Ext JS入门
- MATLAB字符串全函数
- 知识图谱技术原理介绍
- C++ IO 库条件状态及EOF
- QT GUI界面假死的处理
- 洛谷 P2827蚯蚓 队列优化
- sourcetree,git 忽略不需要提交的文件步骤
- 把Java程序打包成jar文件包并执行
- LeetCode8-StringtoInteger
- 初学java的小笔记
- [八]RabbitMQ-客户端源码之ChannelN
- [转]centos7中yum安装ntfs-3g