У меня есть вопрос о том, как использовать постоянство в C ++ без использования STL. Я хочу сохранить некоторую историю вычислений в памяти и обновлять ее новыми вычислениями при каждом вызове программы. Я не могу использовать статический класс хранения, так как после выполнения память теряется.
Любые указатели помогут. Является ли потоковая передача правильным подходом?
Самое простое — это записывать и читать структуры на диске. Сначала определите, что вы хотите хранить:
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
необходим, чтобы предотвратить «нормализацию» потоков новой строкой (вы храните двоичные данные, а не текст).__packed__
необходимо, чтобы структура имела одинаковый размер во всех системах. то же самое int32_t
вместо просто int
,static_assert
; в более ранних версиях C ++ вы можете использовать BOOST_STATIC_ASSERT
если ты хочешь.Других решений пока нет …