存储数据和访问,并在C ++中执行后从内存更新它

时间:2015-12-15 05:39:24

标签: c++ datapersistance

我有一个关于如何在不使用STL的情况下在C ++中使用persistance的问题。我想在内存中存储一​​些计算历史,并在调用程序时使用新计算更新它。我不能在执行后使用静态存储类,内存丢失。

任何指针都会有所帮助。流媒体是正确的方法吗?

1 个答案:

答案 0 :(得分: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. 需要
  3. __packed__以确保结构在所有系统上具有相同的大小。同上int32_t而不只是int
  4. 此代码不处理“endian”问题,这意味着您需要在机器的相同“字节序”上保存和恢复状态,因此您无法保存x86并加载SPARC。
  5. 结构必须不包含任何指针,这意味着它不能包含大多数STL容器,字符串或任何其他动态大小的元素。在C ++ 11中,您可以使用static_assert在编译时确保这一点;在早期版本的C ++中,如果需要,可以使用BOOST_STATIC_ASSERT