Проще всего писать и читать структуры на диске. Во-первых, определить, что вы хотите сохранить:
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");
Некоторые важные замечания:
std::ios::binary
необходимо для предотвращения потоков от "no rmalizing "newlines (вы храните двоичные данные, а не текст).
__packed__
необходимо, чтобы структура была одинакового размера для всех систем. Ditto int32_t
вместо int
.
- Этот код не обрабатывает проблемы «endian», что означает, что вам нужно сохранить и восстановить состояние с той же «конечностью» машины, что вы не можете, например, сохранить на x86 и загрузить SPARC.
- Структура не должна содержать никаких указателей, то есть она не может содержать большинство контейнеров STL, строк или любых других элементов динамического размера. В C++ 11 вы можете обеспечить это во время компиляции с помощью
static_assert
; в более ранних версиях C++ вы можете использовать BOOST_STATIC_ASSERT
, если хотите.
Вам понадобится быть более конкретным. Рассматривали ли вы запись в файл? (Кроме того, я удалил тег C, потому что в вашем описании упоминается C++, и они являются отдельными языками) –