gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:03:03 26 4
gpt4 key购买 nike

我正在尝试重载来自 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com