用c++将信息写入文件的函数

functions to write information to a file in C++

本文关键字:文件 函数 c++ 信息      更新时间:2023-10-16

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

有人能帮我一下吗?由于

没有匹配的函数调用'std::basic ofstream<char>::open( std::string&, const openmode&)'

"no matching function"错误表示编译器搜索了但没有找到与调用站点提供的实参匹配的重载。open()在c++ 11之前有一个过载,它占用了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()只需要在您希望查看它是否工作的情况下,或者如果您不再需要该文件并希望立即刷新输出。

也许你的编译器不是c++ 11。试着改变

output.open(file, ios::app);

output.open(file.c_str(), ios::app);

接受std::string实参的ofstream构造函数是在c++ 11中添加的。假设您的编译器支持它,您需要启用c++ 11模式(gcc和clang的-std=c++11)。否则,将函数调用更改为:

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
}

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

我相信你的问题是你试图用std::string而不是char *作为第一个参数来调用open。参见上面代码中的注释