【问题标题】:dumping c++ structures to a text file将 C++ 结构转储到文本文件
【发布时间】:2010-10-10 05:52:32
【问题描述】:

如何将 C++ 中结构的内容写入文本文件?我想做的是,假设我有一个名为 A 的结构,具有数据成员 A.one、A.two 等,我想将它们逐行写到文本文件中,就像这样

结构 A
A.one = 价值
A.two = 价值 ...

结构B
B.one = 价值
B.two = 价值

基本上我想转储.. 有没有简单的方法可以做到这一点?最好的 I/O 方法是什么?文件? iostream?谢谢.. 有没有更简单的方法来转储一个类的成员数据的所有值?


编辑:废话,谢谢大家..

【问题讨论】:

标签: c++ logging file-io


【解决方案1】:

在 C++ 中没有反射,因此您必须手动进行,例如(使用 iostream,为简单起见):

dump_A(std::cout, "A", a);

void dump_A(std::iostream& os, const char* name, A const& a)
{
    os << "Structure " << name << '\n'
       << name << ".one = " << a.one << '\n'
       << name << ".two = " << a.two << '\n';
}

【讨论】:

    【解决方案2】:

    C++ 不是内省的。也就是说,它对其结构的内容一无所知。您必须使用某种手动注释或反射系统来执行此操作。

    当然,如果您对有关结构的硬编码信息没问题,您可以使用任何 I/O 方法转储信息。

    例如:

    struct A
    {
      int member1;
      char member2;
    };
    
    void PrintA (const A& a)
    {
      std::printf ("member1: %d\n", a.member1);
      std::printf ("member2: %c\n", b.member2);
    }
    

    正如您所见,这很乏味,因为它需要对结构有深入的了解,并且如果结构发生变化,也不会自动更新。但是反射系统“正确”执行此操作的开销可能是一个缺点,尤其是在您正在学习的情况下。

    【讨论】:

    • 也许在这里使用 C++ 标准 I/O 类会更安全?如果 member1 和 member2 的类型将被更改,那么您的代码将无法正常工作。
    • 我不喜欢使用 C++ 流 IO。你是对的,在这种情况下它会稍微安全一些,但关键是代码需要仔细更新才能与结构定义保持同步,无论你喜欢哪种 IO 方案都是如此。
    【解决方案3】:

    我在 boost 序列化库方面取得了成功。它易于使用,是 C++ 数据结构序列化和反序列化的自然选择。

    这里是教程的链接: http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/index.html

    【讨论】:

      【解决方案4】:

      这更适用于 C 而不是 C++,但请记住,如果您确实将结构直接写入文件(或网络缓冲区),那么结果将取决于机器和编译器。整数将按主机字节顺序写入,结构的编译器填充字节也将包括在内。尝试在具有不同字节序或不同编译器指令的机器上读取缓冲区将不起作用

      这会发生在类似的情况下(请原谅语法):write(f, &A, sizeof(A));

      【讨论】:

        【解决方案5】:

        IF 这只是一个 struct,一种普通的旧 C 兼容数据类型,具有 NO 虚拟方法NO 指针,然后作为一个短期的组合你可以使用:

        struct Foo {  int a, b;  char c, d, e[50]; }  f;
        write( fd, & f, sizeof(f) );
        

        但是,不要期望这是跨平台的,甚至是同一平台上的跨编译器版本。

        I think I've discussed this before...

        【讨论】:

        • write(fd,....) 中的 fd 是什么意思?那是文件句柄吗?它有一些指针.. =/
        • fd == 文件描述符,从 open() 获得。如果您使用的是 FILE*(来自 fopen),则可以使用 fwrite()。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多