重载<<输出到文件中

时间:2016-03-05 16:49:44

标签: c++ operator-overloading ofstream

所以我有:

在我的.h:

friend std::ofstream & operator <<(std::ofstream & output, myClass & s);

和我的.cpp

 std::ofstream & operator <<(std::ofstream & output, myClass & s)
{
    ofstream ofile << ("output.txt");
    output << "Test" << endl;
    return output;
}

我收到错误:

  

'&lt;&lt;'之前的预期初始化程序令牌

在`std :: ofstream&amp; operator&lt;&lt;(std :: ofstream&amp; output,myClass&amp; s)

  

与'operator&lt;&lt;'不匹配(操作数类型是'std :: ofstream {aka std :: basic_ofstream}'和'const char [5]')

ofstream ofile << ("output.txt");

这个问题是什么?`

`

2 个答案:

答案 0 :(得分:3)

将函数限制为std::ofstream通常不太适合使用任何std::ostream。当您将非const引用传递给打印函数时,它看起来也非常可疑。这意味着您正式允许打印具有修改打印对象的副作用!

出于这些原因,你应该改变这个:

std::ofstream & operator <<(std::ofstream & output, myClass & s);

对此:

std::ostream & operator <<(std::ostream & output, myClass const& s);

您也不需要在运算符的实现中创建流实例。您将收到一个引用作为第一个参数。所以就这样做(虽然我们正在做,但要避免endl,除非你确切知道自己在做什么):

std::ostream & operator <<(std::ostream & output, myClass const& s);
{
    output << "Test\n";
    // output << s.some_member << "\n";
    return output;
}

您现在可以将std::ofstream对象传递给该函数并写入该文件。您只需要创建对象,将文件名传递给它的构造函数:

myClass s;
std::ofstream os("output.txt");
os << s;

答案 1 :(得分:0)

你可能想要做类似以下的事情:

ofstream ofile{"output.txt"};
ofile << some_object;

这是调用 std :: ofstream 的构造函数以及后续写入指定的流,后者又写入文件。