【问题标题】:Pass a reference to std::ifstream as parameter传递对 std::ifstream 的引用作为参数
【发布时间】:2014-12-16 09:19:23
【问题描述】:

我正在尝试编写一个带有 ifstream& 参数的函数。

void word_transform(ifstream & infile)
{
    infile("content.txt");
    //etc
}

这给了我一个错误:

类型“ifstream”(又名“basic_ifstream”)不提供呼叫运算符。

请问有什么问题吗?

【问题讨论】:

  • infile.open("content.txt"); 大概。
  • 采用流参数的函数通常适用于已经打开的流。例如,ifstream s("content.txt"); word_transform(s);

标签: c++ function ifstream


【解决方案1】:

call operator 是一个类似operator()( params ) 的函数,允许使用语法myObject( params )

所以,当您写infile(...) 时,您是在尝试给我们打电话。

你要做的是打开一个文件,使用open方法:

void word_transform(ifstream & infile)
{
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}

但是,正如评论的那样,将 infile 引用传递给这样的函数并没有真正意义。您可以考虑:

void word_transform(istream& infile)
{
    infile << "hello";
}

int main()
{
    ifstream infile;
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        word_transform( infile );
    infile.close();
    return 0;
}

或者:

void word_transform()
{
    ifstream infile;
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}

int main()
{
    word_transform();
    return 0;
}

【讨论】:

  • 你最后的评论很中肯:如果他要在函数中打开和关闭文件,std::ifstream 应该是函数本地的;将其作为论据毫无用处。然而,更常见的习惯用法是让调用者打开和关闭它,并传递std::istream&amp; 参数(而不是std::ifstream&amp;)。
【解决方案2】:

您尝试在您的参数上调用operator()。这是行不通的。您是否正在尝试打开文件?如果你得到一个ifstream 作为参数,它应该从一开始就打开,因为你在你的函数之外打开了它。传递一个流然后在你的函数中打开它是没有意义的。

void word_transform(std::ifstream& infile)
{
    // read something from infile
}

int main()
{
   std::ifstream file("content.txt");

   // error checks

   word_transform(file);

   return 0;
}

【讨论】:

    【解决方案3】:

    据我了解,呼叫操作员是operator(),显然没有为ifstream 定义。你必须对word_transform的参数做一些不同的事情。

    【讨论】:

      【解决方案4】:
      infile("content.txt");
      

      请注意,这将尝试在已创建的 infile 类型对象上调用 operator()。由于 ifstream 中不存在这样的运算符,因此出现错误。

      你应该这样做:-

      infile.open("content.txt");
      

      【讨论】:

        【解决方案5】:

        通常,(引用)流被传递给 I/O 函数。这意味着该功能应该采取 std::istreamstd::ostream 参数,但不是 std::ifstreamstd::ofstream。这样,您的函数可以与派生自std::istream 的任何流对象一起使用,包括std::cinstd::istrstreamstd::ifstream

        正如 nvoigt 所说,将 std::ifstream 传递给用于打开的函数几乎没有意义。调用者肯定不清楚它的流可能被关闭并打开到另一个文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-05
          • 1970-01-01
          • 2016-03-31
          • 2018-09-26
          相关资源
          最近更新 更多