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

C++ 将对std::ifstream的引用作为参数传递,c++,function,ifstream,C++,Function,Ifstream,我正试图用ifstream&参数编写一个函数 void word_transform(ifstream & infile) { infile("content.txt"); //etc } 这给了我一个错误: 类型“ifstream”(也称为“basic_ifstream”)不提供呼叫运算符 您能告诉我出了什么问题吗?您试图调用操作符()处理您的参数。那是行不通的。你想打开一个文件吗?如果您获得一个ifstream作为参数,那么它应该从一开始就打开,因为您在函数外部打开

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

void word_transform(ifstream & infile)
{
    infile("content.txt");
    //etc
}
这给了我一个错误:

类型“ifstream”(也称为“basic_ifstream”)不提供呼叫运算符


您能告诉我出了什么问题吗?

您试图调用
操作符()
处理您的参数。那是行不通的。你想打开一个文件吗?如果您获得一个
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;
}

据我所知,调用操作符是
operator()
,它显然不是为
ifstream
定义的。您必须对
word\u transform
的参数做一些不同的操作

infile("content.txt");
请注意,这将尝试对已创建的infle类型的对象调用运算符()。由于ifstream中不存在这样的运算符,因此出现了一个错误

相反,你应该:-

infile.open("content.txt");
调用运算符是类似于
operator()(params)
的函数,允许使用语法
myObject(params)

因此,当您编写
infle(…)
时,您试图给我们一个呼叫接线员

要打开文件,请使用
open
方法:

void word_transform(ifstream & infile)
{
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}
void word\u转换(ifstream和infle)
{
open(“content.txt”,std::ios\u base::in);
if(infle.is_open())
infle通常,(对的引用)流被传递给函数进行I/O。这意味着函数应该
std::istream
std::ostream
参数,但不是
std::ifstream
std::ofstream
。这样,您的函数可以用于从
std::istream
派生的任何流对象,包括
std::cin
std::istrstream
std::ifstream


正如nvoigt所说,将
std::ifstream
传递给函数以打开没有什么意义。调用者肯定不清楚它的流是否会被关闭并打开到另一个文件。

infle.open(“content.txt”)
content.txt)。采用流参数的函数通常与已打开的流一起工作。例如,
ifstreams(“content.txt”);word_转换
。您最后的评论非常贴切:如果他要在函数中打开和关闭文件,则
std::ifstream
应该是函数的本地文件;将其作为参数没有任何作用。但是,更常见的习惯用法是由调用方打开和关闭,并传递
std::istream&
argument(而不是
std::ifstream&
)。
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;
}