fstream中eof的机制
来源:互联网 发布:java list sort方法 编辑:程序博客网 时间:2024/06/06 15:50
一个测试程序: 一个简单的复制文件程序
#include <fstream>
using namespace std;
int main(){
fstream in("aaa.txt",ios::in);
fstream out("bbb.txt",ios::out);
if(!in)//判断打开是否成功
return 0;
while(!in.eof()){
char ch=in.get();
out.put(ch);
}
return 0;
}
aaa内容abc,3字节
输出bbb后内容为abc (空字符,不为空格),4字节
查看16进制文件:
aaa中内容为:61 62 63,显然是abc三个字符对应的ascii码的十六进制形式
bbb中内容为:61 62 63 FF,看来最后一个字符应该就是这个FF了
为什么变成4字节了呢?
我们可以想想eof读取磁盘的机制。如果说在eof()中也需要读取磁盘,那么加上get()中读取磁盘,会导致读取磁盘的次数是实际读取到的内容的两倍,对于内容很多的文档是相当大的浪费。
显然C++在设计fstream类时考虑到了效率的问题,因此在eof()中实际上是不进行磁盘读取的,只是根据类中eofbit的值,来返回eof()的值,而eofbit会在读取到第一个不正常字符的时候赋值为1。
那么显然对于上面的测试程序,在读到最后一个字符时,实际并没有读到不正常字符,那么eofbit的 值自然是0,就不会跳出循环,就会继续读一个不正常字符,那样自然就会多出FF了。
如果要让最后这个字符不显示,那么需要的过程为:
1.ch=in.get();
2.判断是否eof();
3.put(ch);
于是将测试程序改为:
#include <fstream>
using namespace std;
int main(){
fstream in("aaa.txt",ios::in);
fstream out("bbb.txt",ios::out);
if(!in)//判断打开是否成功
return 0;
char ch;
int i=0;
do{
if(i==1)
out.put(ch);
else
i++;
ch=in.get();
}
while(!in.eof());
return 0;
}
成功完全复制为3字节。
- fstream中eof的机制
- fstream::eof()
- EOF的处理机制
- C++中fstream的用法
- fstream 中 eofbit 的控制
- C++中fstream的用法
- C++中fstream的使用
- error:while(ch = fgetc(fStream)!= EOF)和while(ch = fgetc(fStream)&& ch != EOF)是有问题的
- C++ fstream流的eof()函数多读一行的问题
- C++ fstream流的eof()函数多读一行的问题
- C++:fstream流的eof()函数多读一行的问题
- C++ fstream流的eof()函数多读一行的问题
- Shell中EOF的用法
- php中heredoc的使用方法(<<<EOF EOF)
- c++中fstream的成员函数
- c++中fstream的成员函数
- Z01 fstream中ofstream的简单用法
- Z02 fstream中ifstream的简单用法
- 十六进制转义
- 第十二周C++作业任务【三】自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承
- 字符串全排列【方法2:利用交换的思想】
- ADO.NET与ORM的比较(5):MyBatis实现CRUD
- hadoop hive sql(HQL)语法解释
- fstream中eof的机制
- ByteStream
- C++模板:函数模板和模板函数
- 行业分类股票按类型的业务
- javax.persistence.EntityNotFoundException: deleted entity passed to persist:异常总结
- 可以帮助投资者比较他们买股票
- Hive中实现自定义函数UDF详细过程
- 保险人不能保证每次都能得胜
- AS3的dynamic类