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

6

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

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

我遇到了一个错误:

'ifstream'类型(又名 'basic_ifstream')不支持调用运算符。

你能告诉我错在哪里吗?


2
infile.open("content.txt"); 大概是打开 "content.txt" 文件。 - user657267
带有流参数的函数通常使用已经打开的流进行操作。例如,ifstream s("content.txt"); word_transform(s); - molbdnilo
5个回答

8

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

1
你的最后一条评论非常恰当:如果他要在函数中打开和关闭文件,那么 std::ifstream 应该是函数内部的局部变量;将其作为参数没有任何意义。然而,更常见的习惯用法是由调用者打开和关闭文件,并传递一个 std::istream& 参数(而不是 std::ifstream&)。 - James Kanze

3
你试图在参数上调用 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
infile("content.txt");

请注意,这将尝试在类型为 infile 的已创建对象上调用 operator()。由于 ifstream 中不存在这样的运算符,因此会出现错误。
相反,您应该执行:-
infile.open("content.txt");

0
据我理解,调用运算符是operator(),但显然对于ifstream未定义。您需要对word_transform的参数进行不同的处理。

0
通常,(对于)流的引用被传递给进行I/O操作的函数。这意味着函数应该接受std::istreamstd::ostream参数,而不是std::ifstreamstd::ofstream。这样,您的函数可以与任何派生自std::istream的流对象一起使用,包括std::cinstd::istrstreamstd::ifstream
正如nvoigt所说,将std::ifstream传递给一个用于打开文件的函数几乎没有意义。对于调用者来说,很明显它的流可能会关闭并打开到另一个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接