c++ - iostream 和 fstream 的重载 <<

标签 c++

我正在尝试重载来自 iostream 的 cout 和来自 fstream 的 fout

ostream& operator<<(ostream& cout, const Object& obj);

ofstream& operator<<(ofstream& fout, const Object& obj);

我希望第一个函数与控制台一起使用,以便为用户提供文本,而我希望第二个函数仅将变量的值输出到文件中。

但是,在

void save_data(const Object& obj)
{
    fstream fout("DataBase.txt", ios::out);

    if (fout.is_open())
    {
        fout << obj;
        fout.close();
    }

    else
        cout << "DataBase.txt could not be saved!" << endl;
}

我有一些文本用于在我的函数内引导用户,该函数会在我的文件中重载 cout。

最佳答案

std::fstream 继承自 std::iostream,而 std::iostream 又继承自 std::ostream。该链中没有 std::ofstream ,因此该重载不适合。

解决此问题的一种方法是在调用站点使用 std::ofstream 而不是 std::fstream。您还可以为 std::fstream 添加重载。但是,请注意 std::ostream 不一定是控制台;它是控制台。这是您必须从其余代码中为自己提供的保证。例如,std::ofstream 可以向上转换为 std::ostream,然后用于打印 Object 并且您的重载集将假设该流用于控制台。可能很难确保代码的其余部分提供这种保证。此外,对控制台的强大检测将依赖于平台,并在网站其他地方有自己的答案(例如 for Windows )。

现有程序处理此要求的一种方法是在命令行上有一个显式的“交互”选项。例如,git 命令使用 --interactive,有时使用 -i 来实现此目的。这样,用户就可以请求额外的引导输出,并且不需要巧妙的检测技巧。

关于c++ - iostream 和 fstream 的重载 <<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58686784/

相关文章:

c++ - 为什么不在 C++ 中调用析构函数?

c++ - 奇怪的交换宏

c++ - 如何打印指针字符数组

C++ QList继承自定义方法问题

c++ - Qt/C++ 中的加密安全伪随机数生成器(跨平台)

c++ - 重新平衡时如何修复 AVL 删除操作中的段错误?

c++ - 函数调用参数总是一个新对象吗?

c++ - 模板函数 "Subscript requires array type",但适用于较小的项目。为什么?

c++ - 原始 pcm 音频文件到 Windows Qt 项目中的 ogg

c++ - 获取当前图像基地址