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字节。

原创粉丝点击