C++使用fstream进行文件读写,非常的方便,但是在日常使用的时候,常常会忽视掉一些小问题,如下:
环境:
Ubuntu16.04
g++: 5.4.0
例如以上代码,在编写时可能察觉不到问题的所在,但编译时就会报如下错:
但是原因何在呢?
因为我们这样写是没问题的:
那么首先来看下ifstream 的open成员函数官方文档是如何介绍的。
以上可以看到,fstream::open有两种重载方式
1:open( const char* filename, ios_base::openmode mode=ios_base::in | ios_base::out);(可以看出 这种写法明显是为了兼容C的写法。);
2: open( const string& filename, ios_base::openmode = ios_base::in | ios_base::out);
可以看到open函数是打开由参数filename标识的文件,将其与流对象相关联,以便对其内容执行输入/输出操作。参数mode指定文件打开的模式。
然后再来看下open函数的参数:
可以看到,上面出问题的地方就在于filename;即filename是要打开的文件名的字符串。 其格式和有效性的细节取决于库的实现和运行环境。
通过上述文档并没有明确找到以上问题的原因。但有说到其格式和有效性的细节取决于库的实现和运行环境。那么在windows(Dev C++)上是否有这类问题呢?
可以发现,同样的写法在windows下是没有问题的,那么linux为什么会出问题呢?
在linux forums找到这句话C++ ofstream::open won't accept string as a filename
因此 根据以上可以推知,linux下会出问题原因就在于string不能直接作为fstream的参数直接传入。
所以 更改如下:
即可顺利通过编译了。