将对std :: ifstream的引用作为参数传递

时间:2014-12-16 09:19:24

标签: c++ function ifstream

我试图用ifstream&参数编写一个函数。

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

给了我一个错误:

  

输入' ifstream' (又名' basic_ifstream')不提供呼叫运营商。

你能解释我的错误吗?

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

调用运算符是一个类似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;
}

答案 2 :(得分:0)

据我了解,调用运算符为operator(),显然没有为ifstream定义。您必须使用word_transform的参数做一些不同的事情。

答案 3 :(得分:0)

infile("content.txt");

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

相反,你应该这样做: -

infile.open("content.txt");

答案 4 :(得分:0)

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

正如nvoigt所说,将std::ifstream传递给开场功能毫无意义。调用者肯定不清楚它的流可能被关闭并打开到另一个文件。