一个测试程序: 一个简单的复制文件程序
#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字节。