我一直在为学校做一个项目,但遇到了一个问题。我试图避免在我的程序中对所有内容进行硬编码,而我的部分要求是使用 fstream。这是抛出错误的原因。我使用 G++ 作为我的编译器。
void order::printToFile(string file)
{
ofstream output;
try
{
output.open(file, ios::app);
}
catch(...)
{
cerr << "An error has occurred";
}
output << this->info.orderID << setw(10) << this->info.type << setw(10) << this->info.quantity << setw(10) << this->info.zip << setw(10) << (this->info.shipCost + this->info.wholesale) << setw(10) << this->info.profit << endl << endl;
output.close();
}
它给我以下错误:
没有可调用的匹配函数 'std::basic ofstream<char>::open( std::string&, const openmode&)'
有人可以帮我解决这个问题吗?谢谢
最佳答案
No matching function to call for
'std::basic ofstream<char>::open( std::string&, const openmode&)'
“无匹配函数”错误意味着编译器搜索但找不到与调用站点提供的参数相匹配的重载。 open()
在 C++11 之前有一个重载,它采用类型为 char const*
的缓冲区。 .这已经更新,除了第一次重载,open()
现在支持 std::string const&
类型的参数.
问题一定是你的编译器不支持 C++11。添加-std=c++11
到命令行应该解决问题。另一方面,如果你不能这样做,你总是可以使用 c_str()
获取指向缓冲区的指针。 :
output.open(file.c_str(), ios::app);
// ^^^^^^^^
您应该知道的另一件事是,IOStreams 默认设计为不抛出异常。相反,它们以称为“流状态”的位掩码类型的形式反射(reflect)流错误。可以使用 bool 运算符方法流支持来访问它。
您可以通过在 exceptions()
中设置适当的位来启用异常面具,但我不会推荐它用于这样一个简单的例子。只需在打开后检查流就足够了:
if (std::ofstream output(file.c_str(), std::ios_base::app)) {
output << "...";
}
else {
std::cerr << "An error has occurred.";
}
最后,流不需要手动关闭。当定义它们的范围结束时,将调用它们的析构函数,从而自动释放文件资源。打电话close()
只有在您希望查看它是否有效,或者您不再需要该文件并希望立即刷新输出的情况下才需要。
关于c++ - 在 C++ 中将信息写入文件的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640325/