datapersistance — сохраняет данные и доступ и обновляет их из памяти после выполнения в переполнении стека

У меня есть вопрос о том, как использовать постоянство в C ++ без использования STL. Я хочу сохранить некоторую историю вычислений в памяти и обновлять ее новыми вычислениями при каждом вызове программы. Я не могу использовать статический класс хранения, так как после выполнения память теряется.

Любые указатели помогут. Является ли потоковая передача правильным подходом?

-1

Решение

Самое простое — это записывать и читать структуры на диске. Сначала определите, что вы хотите хранить:

struct SavedState {
int32_t a;
float b;
char c[100]; // n.b. you cannot use std::string here!
} __attribute__((__packed__));

static_assert(std::is_trivially_copyable<SavedState>::value,
"SavedState must be trivially copyable");

Затем создайте некоторое состояние и сохраните его:

SavedState s = { 1, 2.3 };
snprintf(s.c, sizeof(s.c), "hello world!");
std::ofstream outfile("saved.state", std::ios::binary);
outfile.write(reinterpret_cast<char*>(&s), sizeof(s));
if (!outfile)
std::runtime_error("failed to write");

Затем восстановите его:

SavedState t;
std::ifstream infile("saved.state", std::ios::binary);
infile.read(reinterpret_cast<char*>(&t), sizeof(t));
if (!infile)
throw std::runtime_error("failed to read");

Некоторые важные замечания:

  1. std::ios::binary необходим, чтобы предотвратить «нормализацию» потоков новой строкой (вы храните двоичные данные, а не текст).
  2. __packed__ необходимо, чтобы структура имела одинаковый размер во всех системах. то же самое int32_t вместо просто int,
  3. Этот код не обрабатывает проблемы с порядком байтов, то есть вам нужно сохранять и восстанавливать состояние на одной и той же «машине байтов», поэтому вы не можете, например, сохранить на x86 и загрузить на SPARC.
  4. Структура не должна содержать никаких указателей, то есть она не может содержать большинство контейнеров STL, строк или любых других элементов динамического размера. В C ++ 11 вы можете убедиться в этом во время компиляции, используя static_assert; в более ранних версиях C ++ вы можете использовать BOOST_STATIC_ASSERT если ты хочешь.
1

Другие решения

Других решений пока нет …