如果我将myfile(“input.txt”)更改为myfile(file_name)...其中file_name传递给函数它不起作用但是给出错误没有匹配的函数调用..我猜b.c.我不是想把一个字符串传递给构造函数......如果不是这样的话......怎么样?
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]);
}
答案 0 :(得分:8)
使用c_str()
班级的std::string
成员:
ifstream myfile(file_name.c_str());
它返回有问题的字符串的以空值终止的const char *
表示,这正是您在此需要的。
答案 1 :(得分:6)
file_name
是std::string
,但ifstream
构造函数需要一个普通的C风格字符串(指向char
的指针)。所以只需使用:
iftsream myfile(file_name.c_str());
这是图书馆和恕我直言的一个相当不干净的部分,因为流库比STL(从中std::string
更早)。因此,流库并不真正了解std::string
。这也是std::getline(std::istream&, std::string&)
成为单独函数的原因(并且是<string>
的一部分,而不是<istream>
或类似的东西),我认为。
可以看出这是一个干净的组件分离,但我认为std::string
应该是C ++中字符串的标准,因此也可以被流库(至少它的接口)使用。由于标准库总是被视为一个整体,这只是组件干净利落的一个不好的例子。也许未来的标准将解决这个问题。
编辑:根据Benjamin的评论(以及我在标准草案中的阅读),C ++ 11似乎确实解决了这个问题,现在您可以使用std::string
作为文件名。但我猜你还没有使用C ++ 11。
答案 2 :(得分:0)
std :: ifstream的构造函数将文件名作为const char *。您可以使用c_str()成员函数将std :: string转换为const char *。
void file_to_string(string file_name)
{
string line;
ifstream myfile(file_name.c_str()); //convert string to const char*
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]);
}
答案 3 :(得分:0)
ifstream将const char *作为参数,因此您无法将std :: string传递给它。 也许你可以试试:
std::string fileName;
... // fill fileName
ifstream myfile( fileName.c_str() );