我正在尝试编写一个带有 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();
}
但是,正如评论中所说,将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;
}
std::ifstream
应该是函数内部的局部变量;将其作为参数没有任何意义。然而,更常见的习惯用法是由调用者打开和关闭文件,并传递一个 std::istream&
参数(而不是 std::ifstream&
)。 - James Kanzevoid 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.open("content.txt");
operator()
,但显然对于ifstream
未定义。您需要对word_transform
的参数进行不同的处理。std::istream
或std::ostream
参数,而不是std::ifstream
或std::ofstream
。这样,您的函数可以与任何派生自std::istream
的流对象一起使用,包括std::cin
、std::istrstream
和std::ifstream
。std::ifstream
传递给一个用于打开文件的函数几乎没有意义。对于调用者来说,很明显它的流可能会关闭并打开到另一个文件。
ifstream s("content.txt"); word_transform(s);
。 - molbdnilo