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