我一直在为学校做项目,我遇到了一个问题。我试图避免在程序中对所有内容进行硬编码,而我的部分要求是使用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&)'
有人可以帮我一把吗?感谢
答案 0 :(得分:5)
没有匹配功能可以调用
'std::basic ofstream<char>::open( std::string&, const openmode&)'
“无匹配函数”错误意味着编译器搜索但找不到与调用站点提供的参数匹配的重载。在C ++ 11之前的open()
有一个重载,它带有char const*
类型的缓冲区。这已经更新,除了第一次重载之外,open()
现在支持std::string const&
类型的参数。
问题必须是您的编译器不能识别C ++ 11。将-std=c++11
添加到命令行应该可以解决问题。另一方面,如果你不能这样做,你总是可以使用c_str()
抓取指向缓冲区的指针:
output.open(file.c_str(), ios::app);
// ^^^^^^^^
您应该知道的另一件事是IOStreams默认设计为不抛出异常。相反,它们以称为“流状态”的位掩码类型的形式反映流错误。可以使用布尔运算符方法流支持来访问它。
您可以通过设置exceptions()
掩码中的相应位来启用异常,但我不建议将其用于这样一个简单的示例。只需在打开后检查流就足够了:
if (std::ofstream output(file.c_str(), std::ios_base::app)) {
output << "...";
}
else {
std::cerr << "An error has occurred.";
}
最后,不需要手动关闭流。当它们被定义的范围结束它们的析构函数时,将调用它自动释放文件资源。只有在您希望查看它是否有效,或者您是否不再需要该文件并希望立即刷新输出时,才需要调用close()
。
答案 1 :(得分:4)
也许你的编译器不是C ++ 11。尝试更改
output.open(file, ios::app);
到
output.open(file.c_str(), ios::app);
答案 2 :(得分:3)
在C ++ 11中添加了带有ofstream
参数的std::string
构造函数。假设您的编译器支持它,您需要启用C ++ 11模式(-std=c++11
用于gcc和clang)。否则,将函数调用更改为:
output.open(file.c_str(), ios::app);
另请注意,如果ofstream
无法打开文件,除非您明确启用例外,否则不会导致异常。
output.exceptions(std::ofstream::failbit);
output.open(file.c_str(), ios::app); // will throw exception if open fails
另一个选项是打开文件,然后检查它是否成功
output.open(file.c_str(), ios::app);
if(!output) {
// error occurred, handle it
}
答案 3 :(得分:0)
这对我来说在Ubuntu 14.04上使用g ++版本4.8.2。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void printToFile (string fname) {
ofstream output;
try {
// NOTE: passing fname.c_str() not just fname
output.open (fname.c_str(), ios::app);
} catch (std::exception e) {
cout << "err occurred: " << e.what() << endl;
}
output << "foo bar baz" << endl;
output.close ();
}
int main () {
printToFile ("foo.txt");
return 0;
}
我认为您的问题是,您尝试使用open
而不是std::string
作为第一个arg来致电char *
。请参阅上面代码中的注释。