创建std::ifstream对象时遇文件名错误,请问失败原因?
问题原因分析与解决办法
你的第二个std::ifstream对象的构造调用触发了编译错误,本质是两个核心问题导致的:
构造函数参数组合不匹配
你给构造函数传了三个参数:const std::string&类型的文件名、std::ios::in、std::ios::ate,但std::ifstream根本没有接受这种参数组合的构造函数。所有的文件打开模式(比如in、ate)需要通过**按位或运算符|**合并成一个std::ios_base::openmode类型的参数,而不是分开传递多个模式参数。C++版本对
std::string参数的支持限制
在C11标准发布之前,std::ifstream的构造函数只支持传入const char*类型的文件名(也就是C风格字符串),不允许直接传入std::string对象。所以如果你的编译器还在使用C03或更早的标准,哪怕你合并了打开模式,直接传(*p)也会报错,必须调用c_str()方法获取C风格字符串指针才行。
修正后的代码示例
如果你使用C++11及以上标准
std::string r = "Hej.whatever"; std::string const *p = &r; // 合并打开模式,直接传入std::string对象 std::ifstream file(*p, std::ios::in | std::ios::ate);
如果你使用C++03标准
std::string r = "Hej.whatever"; std::string const *p = &r; // 通过c_str()获取C风格字符串,同时合并打开模式 std::ifstream file((*p).c_str(), std::ios::in | std::ios::ate);
另外补充一句:你写的第一个构造调用(用了c_str()的那个)其实也存在参数数量的问题,同样是传了三个参数,只是编译器优先报错了第二个调用,所以重点修正了第二个的问题。
内容的提问来源于stack exchange,提问作者Moonrak
相关产品推荐
相关产品推荐

