【问题标题】:C++ vector of class objects to file\back to program类对象的 C++ 向量到文件\返回到程序
【发布时间】:2012-05-22 12:31:10
【问题描述】:

我期待在每次重新启动程序时都能使用我的数据。我很好奇哪种方式是存储到文件而不是读回程序的最佳方式。我一直在网上阅读一些东西,最大的问题是 XML 还是二进制格式?我还在学习 c++ 我不掌握它。该程序的对象类型为string int int ...您建议我使用哪种方式,为什么?

还有人知道这个to binaryto XML 的好教程吗?

很抱歉缺少代码部分,但我想知道比我更高级的程序员的一些意见。 :P

【问题讨论】:

  • 您所说的是“对象持久性”。搜索这些术语,您可能会发现一些有用的东西。不过,总的来说,业界更喜欢 XML、JSON 或 YAML 等非二进制格式,因为它们可以编辑,并且不具有平台二进制依赖性,例如 int 的大小或字节顺序。

标签: c++ xml-serialization


【解决方案1】:

除了 Matthais 的评论:

我认为最明显的格式在你的情况下是正确的,那就是纯文本。

只需以纯文本(通常由空格分隔)序列化您的数据。 PT 的好处是它是人类可读的、人类可修改的、易于使用流(>> 标记化或增强标记化器)进行处理、灵活且比 XML 轻得多。

例如,您可能想要存储

struct {
    std::string name;
    int age;
    double height;
};

你只会写:

John 21 5.4
Bill 31 4.9

或者你有什么。这总是很方便,例如 name 可以包含两个单词:

John Smith

标记器会在空格上拆分并尝试将 smith 解析为 int,但使用分隔符很容易解决这个问题。如“”

【讨论】:

  • 你在说什么标记器,你能告诉我 c++ 的函数/库吗?
  • 纯文本的缺点是1)你要自己写解析器,2)后期很难扩展,3)错误恢复比较困难。
  • @MikeDeSimone 如果结构复杂,您只需要编写一个解析器,而且大多数解析器都很容易编写。 2)。不比二进制更难,也许比 XML 3) 更难。但有可能,祝你好运向用户解释为什么他们的 XML 或二进制数据不正确。
【解决方案2】:

我不同意。有很多可用的选项。还有两个我在这里命名你: 1) 您可以查看名为json 的文件格式,它有自己的网站(我们中的一些人不这样做)。它声称是一种轻量级的数据交换格式。 2) 有一种名为 csv 的文件格式。它的用法已经在stackoverflow上讨论过here

【讨论】:

  • 仅当“我想在 Excel 或同等工具中编辑”是一项重要功能时才使用 CSV。
【解决方案3】:

即使您的进程被过早终止(例如由于断电、硬件故障或代码本身存在严重错误),您是否需要稳健的行为?

如果是这样,请考虑使用“嵌入式”数据库,例如 SQLite 或 MS SQL Server Compact(等)。这些系统的事务性质应确保您最终不会得到损坏的数据,这会阻止您的程序正确启动。

此外,一些文件系统支持事务(例如 Windows Vista 或更高版本中的事务性 NTFS)。

【讨论】:

  • 这看起来很有趣,但复杂性比我预期的要高一些。我在 Python 中使用了 Json。我不知道它是用于 c++ 的,也感谢您通知我。 :)
  • 我会说“我需要处理的数据远远超过内存中合理的容量,并且对这些数据进行大量交叉引用”比“健壮性”更适合使用数据库。”
  • @MikeDeSimone 好吧,总的来说,所有这些都是正当的理由,但问题的措辞表明,在这种特殊情况下,“交叉引用”的大小和需求都不是问题。我确实提到了事务文件系统作为替代方案。
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2011-06-06
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多