用于在C ++中将信息写入文件的函数

时间:2014-05-13 19:50:53

标签: c++ c++11 fstream ofstream

我一直在为学校做项目,我遇到了一个问题。我试图避免在程序中对所有内容进行硬编码,而我的部分要求是使用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&)'

有人可以帮我一把吗?感谢

4 个答案:

答案 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 *。请参阅上面代码中的注释。