2015-12-15 8 views
-1

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

Любые указатели помогут. Правильно ли работает поток?

+0

Вам понадобится быть более конкретным. Рассматривали ли вы запись в файл? (Кроме того, я удалил тег C, потому что в вашем описании упоминается C++, и они являются отдельными языками) –

ответ

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