将c ++结构转储到文本文件中

时间:2009-02-27 01:50:17

标签: c++ logging file-io

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

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

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

基本上我想要转储..有一个简单的方法吗?什么是最好的I / O方法? CFile的? iostream的?谢谢..是否有更简单的方法来转储类的成员数据的所有值?


编辑:废话,谢谢你们......

5 个答案:

答案 0 :(得分:8)

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';
}

答案 1 :(得分:5)

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);
}

正如您所看到的,这是繁琐的,因为它需要对结构有深入的了解,并且如果结构发生变化,则不会自动更新。但是,反射系统“正常”执行此操作的开销可能是一个缺点,特别是如果您正在学习。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

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

这会发生在类似的事情上(对句法宽容):写(f,&amp; A,sizeof(A));

答案 4 :(得分:0)

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

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

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

I think I've discussed this before...