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。


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

猜你喜欢

转载自blog.csdn.net/chrisxiaoniu/article/details/80505251