1 c++
如果我将myfile("input.txt")更改为myfile(file_name)...其中file_name传递给函数它不起作用但是给错误没有匹配函数调用..我猜我不是bc我不是假设要将一个字符串传递给构造函数...如果不是这样的话......怎么样?
void file_to_string(string file_name)
{
string line;
ifstream myfile("input.txt");
if(myfile.is_open())
{
while(myfile.good())
{
getline(myfile,line);
cout << line;
}
myfile.close();
}
else
{
cout << "File : " << file_name << " : did not open" ;
}
}
int main(int argc, char *argv[])
{
file_to_string(argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
使用该类的c_str()
成员std::string
:
ifstream myfile(file_name.c_str());
Run Code Online (Sandbox Code Playgroud)
它返回有const char *
问题的字符串的以null结尾的表示,这正是您在此需要的.
file_name
是一个std::string
,但ifstream
构造函数想要一个普通的C风格的字符串(指向char
).所以只需使用:
iftsream myfile(file_name.c_str());
Run Code Online (Sandbox Code Playgroud)
这是图书馆和恕我直言的一个相当不干净的部分,因为流库比STL(从中std::string
获取)更早.所以流库并不真正了解std::string
.我认为这也是std::getline(std::istream&, std::string&)
成为一个单独功能的原因(<string>
而不是<istream>
或类似的一部分).
可以看出这是一个干净的组件分离,但我认为它std::string
应该是C++中字符串的标准,因此也可以被流库(至少它的接口)使用.由于标准库总是被视为一个整体,这只是组件干净利落的一个不好的例子.也许未来的标准将解决这个问题.
编辑:根据本杰明的评论(以及我通过标准草案阅读),C++ 11似乎确实解决了这个问题,你现在可以使用std::string
as文件名.但我猜你还没有使用C++ 11.