ifstrem流不能使用ios::app标示

项目基本结束啦,上周五我们带着源代码去客户公司部署。

同一份代码,换了个旧版本的GCC编译器,编译时就有种不好的预感,果然编译出来的程序的执行结果就死活不对。

Linux下Debug了半天,终于将问题缩小到了下面一行代码上:

fs.open(filePath, ios::binary | ios::app);

这个fs是由函数的模板参数传递下来的,即可能是输入流,也可能是输出流,该部分代码主要功能是校验需要打开的文件是否合法并将传入的文件流给open了。

在传入的fs是输入流时,fs的open函数执行会失败,即无法打开指定文件。

对于输入流而言,只是读取流中的内容,不存在对其追加的需求,所以我试着把ios::app标记移除,果然可以正常打开输入流了。

想想还是让一个函数承载了混乱职责,才出现了输入流也以app模式打开这种奇怪代码,最终我们决定将校验文件是否合法这一功能单独提取一个函数,而文件流的打开由调用方自己去维护。

总结:老版本的GCC编译器对于输入流ifstream的打开标记做了严格的限制,如果以app模式打开一个输入流是会失败的。

最新版的GCC编译器更加仁慈一点,对于输入流以app模式打开,不会导致流打开失败,只不过这个app模式对于输入流无效罢了。

原文地址:https://www.cnblogs.com/itZhy/p/2733827.html