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



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

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

这给了我一个错误:

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

你能请我怎么了吗?

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

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

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;
}

您尝试对参数调用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;
}
infile("content.txt");

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

相反,你应该这样做:-

infile.open("content.txt");

据我了解,调用运算符是 operator() ,这显然不是为ifstream定义的。你必须对word_transform的论点做一些不同的事情.

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

正如 nvoigt 所说,将std::ifstream传递给函数进行打开是没有意义的。调用方绝对不清楚其流是否可能被关闭并打开到另一个文件。

最新更新