дамп структур c ++ в текстовый файл

как можно было бы записать содержимое структуры на C++ в текстовый файл? Что я хочу сделать, это, скажем, у меня есть структура с именем A, с элементами данных A.one, A.two и т. Д., И я хочу записать их построчно в текстовый файл, вот так

Структура A
A.one = значение
A.two = значение ...

Структура B B.
один = значение
B. два = значение

В основном хочу сделать дамп .. Есть простой способ сделать это? Какой лучший метод ввода-вывода для этого? CFile? iostream? Спасибо .. Есть ли более простой способ сбросить все значения данных-членов класса?


РЕДАКТИРОВАТЬ: Дерьмо, спасибо, ребята ..

Ответов (5)

Решение

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

Это больше относится к C, чем к C++, но имейте в виду, что если вы действительно пишете структуру непосредственно в файл (или сетевой буфер), то результат будет зависеть от машины и компилятора. Целые числа будут записаны в порядке байтов хоста, и байты заполнения компилятора для структуры также будут включены. Попытка прочитать буфер на машине с другим порядком байтов или разными директивами компилятора не сработает.

Это могло произойти с чем-то вроде (будьте снисходительны к синтаксису): write (f, & A, sizeof (A));

ЕСЛИ это просто структура , простой старый C-совместимый тип данных, без виртуальных методов и указателей , то в качестве краткосрочного кладжа вы можете просто использовать:

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

Однако не ожидайте, что это будет кросс-платформенный или даже кросс-компиляторный пересмотр на той же платформе.

Думаю, я уже обсуждал это раньше ...

C++ не интроспективен. То есть он ничего не знает о содержимом своих структур. Для этого вам нужно использовать какую-то ручную аннотацию или систему отражения.

Конечно, если вы согласны с жестким кодированием информации о структурах, вы можете выгрузить информацию с помощью любого метода ввода-вывода.

Например:

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++.

Вот ссылка на руководство: http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/index.html