gpt4 book ai didi

c++ fstream - 创建自己的格式化标志

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:39 27 4
gpt4 key购买 nike

我需要为输出文件的格式创建新的标志。我有课

class foo{
bar* members;
ofstream& operator<<(ofstream&);
ifstream& operator>>(ifstream&);
};

我想像这样使用它:

fstream os('filename.xml');
foo f;
os << xml << f;
os.close();

这将保存一个 xml 文件。

fstream os('filename.json');
foo f;
os << json << f;
os.close();

这是一个 json 文件。

我该怎么做?

最佳答案

您可以轻松创建自己的操纵器,或者劫持现有的标记或使用 std::ios_base::xalloc 获取特定的新流内存,例如(在Foo的实现文件中:

static int const manipFlagId = std::ios_base::xalloc();

enum
{
fmt_xml, // Becomes the default.
fmt_json
};

std::ostream&
xml( std::ostream& stream )
{
stream.iword( manipFlagId ) = fmt_xml;
return stream;
}

std::ostream&
json( std::ostream& stream )
{
stream.iword( manipFlagId ) = fmt_json;
return stream;
}

std::ostream&
operator<<( std::ostream& dest, Foo const& obj )
{
switch ( dest.iword( manipFlagId ) ) {
case fmt_xml:
// ...
break;
case fmt_json:
// ...
break;
default:
assert(0); // Or log error, or abort, or...
}
return dest;
}

在 header 中声明 xmljson,工作就完成了。

(说到这里,我倒觉得有点滥用操纵者。像 xml 这样的格式超越了简单的本地格式,并且最好由拥有 ostream 的单独类处理,并且写入整个流,而不仅仅是单个对象。)

关于c++ fstream - 创建自己的格式化标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9629949/

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