fstream中eof的机制

一个测试程序: 一个简单的复制文件程序

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值