выгрузка структур c ++ в текстовый файл - PullRequest
7 голосов
/ 27 февраля 2009

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

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

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

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


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

Ответы [ 5 ]

8 голосов
/ 27 февраля 2009

Нет отражения в 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';
}
5 голосов
/ 27 февраля 2009

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

Как видите, это утомительно, потому что требует глубокого знания структуры и не будет обновляться автоматически при изменении структуры. Но накладные расходы системы отражения, чтобы сделать это «должным образом», могут быть недостатком, особенно если вы учитесь.

3 голосов
/ 27 февраля 2009

Я добился успеха с библиотеками ускоренной сериализации. Его простой в использовании и естественный выбор для сериализации и десериализации структур данных C ++.

Вот ссылка на учебник: http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/index.html

0 голосов
/ 27 февраля 2009

IF это просто struct , обычный старый C-совместимый тип данных, с НЕТ виртуальных методов и НЕТ указателей тогда как краткосрочный ключ вы можете просто использовать:

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

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

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

0 голосов
/ 27 февраля 2009

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

Это может произойти с чем-то вроде (прощайте синтаксис): write (f, & A, sizeof (A));

...