使用变量名打开文件

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)

Mat*_*Mat 8

使用该类的c_str()成员std::string:

ifstream myfile(file_name.c_str());
Run Code Online (Sandbox Code Playgroud)

它返回有const char *问题的字符串的以null结尾的表示,这正是您在此需要的.


Chr*_*ica 6

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::stringas文件名.但我猜你还没有使用C++ 11.