C++文件打开模式如果使用了||会怎样?

这来源于自己书写错误,结果编译器没有报任何错,但没得到想要的结果,找了很久的错,尴尬!

使用的编译器为VS2013,在此编译器下,文件模式参数中,使用ios或ios_base效果相同。

言归正传,比如写一段常用的文件追加代码,正确的如下:

const char * file = "aa.txt";
ofstream fout(file,ios_base::out | ios_base::app);

假如书写错误,将追加代码写成如下形式:

ofstream fout(file,ios_base::out || ios_base::app);

这时编译器正常编译,不会有任何错误或警告,开始运行,当文件不存在的时候不能成功新建文件,fout.is_open( )返回false。文件存在时则更加有迷惑性,因为它既不是追加,也不是截短,而是覆盖,举个例子,假如之前的文件内容为123abc,打开文件写入new,则文件新内容为newabc。

问题也出现在二进制文件的写入中。我们将代码改为:

const char * file = "planets.dat";
ofstream fout(file, ios_base::out || ios_base::app || ios_base::binary);

情况类似,编译器不会有任何错误或警告,点击运行,文件不存在的时候不能成功新建文件,fout.is_open( )返回false。文件存在时既不追加,也不截短,而是覆盖,这时由于是二进制文件,更难发现错误,很容易发生无法理解的状况。比如在我的一个程序中:


我想要的输出结果是:

Earth:   5962000000  9.81
Neil's Planet:     23020020  8.82

结果没有正常的追加,而且覆盖时破坏了原有的数据,覆盖后新数据也由于之前的残留,也无法正常读入显示,我输入的8.82变为0.00。


在读入文件时,使用||同样不会报错,目前运行时也能正常读入,不知道是否有其他异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值