使用变量名打开文件

时间:2011-10-13 16:03:39

标签: c++

如果我将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]);
}

4 个答案:

答案 0 :(得分:8)

使用c_str()班级的std::string成员:

ifstream myfile(file_name.c_str());

它返回有问题的字符串的以空值终止的const char *表示,这正是您在此需要的。

答案 1 :(得分:6)

file_namestd::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() );