“最佳”输入文件格式为C ++? [关闭](“Best” Input File Formats

2019-07-19 06:39发布

我上了一个新的软件,最终会需要一些强大的,可扩展的文件IO开始工作。 有很多的格式在那里。 XML,JSON,INI等。然而,总有一些加分和劣势,所以我想我会问一些社区的意见。

这里有一些粗略的要求:

  1. 格式为“标准” ......我不想推倒重来,如果我没有。 它没有成为一个正式的IEEE标准的事,但你可以谷歌并获得新用户的一些信息,可能有一些支持工具(编辑)超越六。 (虽然软件的用户通常是精通电脑和乐于使用vi。)
  2. 轻松地与C ++集成。 我不希望有沿100MB库,三个不同的编译器拉让它运行起来。
  3. 支持表格输入(2d中,n维)
  4. 支持POD类型
  5. 能否扩大,因为需要更多的投入,结合很好的变量等。
  6. 解析速度是不是非常重要
  7. 理想的情况下,容易写(反映),因为它是阅读
  8. 非常适用于Windows和Linux
  9. 支持合成(一个文件中引用另一个文件阅读,等等。)
  10. 人类可读

在一个完美的世界,我会用一个只有标题 - 库或一些干净的STL实现,但我很好利用升压或一些小的外部库是否正常工作。

那么,什么是你对各种格式的想法? 缺点? 好处?

编辑

选项的考虑? 还有什么补充的吗?

  • XML
  • YAML
  • SQLite的
  • 谷歌协议缓冲
  • 升压序列化
  • INI
  • JSON

Answer 1:

有一个满足所有标准的一个极好的格式:

SQLite的!

请阅读文章有关使用SQLite作为应用程序的文件格式。 另外,请观看谷歌技术讲座由D·理查德·希普(SQLite的作者)关于这个题目。

现在,让我们看看如何SQLite的满足您的要求:

格式为“标准”

SQLite的已经成为大多数移动环境的首选格式,并为许多桌面应用程序(火狐,雷鸟,谷歌Chrome,Adobe Reader中,你的名字)。

容易使用C ++集成

SQLite的具有标准C接口 ,这是只有一个源文件和一个头文件。 有C ++包装过 。

支持表格输入(2d中,n维)

SQLite的表为表,你可能想象。 为了表示说3维数据,创建表的列x,y,z,value和存储数据为一组这样的列:

x1,y1,z1,value1
x2,y2,z2,value2
...

支持POD类型

我想通过POD你的意思是普通老式的数据,或BLOB。 SQLite的,您可以存储BLOB字段是。

能否扩大,因为需要更多的投入,以及绑定变量

这是它真正的亮点。

解析速度是不是非常重要

但SQLite的速度是一流的。 事实上,解析是基本上透明的。

理想的情况下,容易写(反映),因为它是阅读

只需使用INSERT编写和SELECT阅读-这可能是更容易?

非常适用于Windows和Linux

没错,和所有其他平台以及。

支持合成(一个文件中引用另一个文件阅读)

您可以将一个数据库到另一个。

人类可读

不是二进制,但也有许多优秀的SQLite的浏览器/编辑那里。 我喜欢SQLite的专家个人在Windows和sqliteman在Linux上。 还有SQLite的编辑器插件的Firefox 。


还有其他的优点是SQLite的为您提供免费的:

  • 数据是可转位 ,这使得它非常快速的搜索。 你不能做到这一点使用XML,JSON或任何其他纯文本格式。

  • 数据可以部分地被编辑,即使当数据量是非常大的。 你不必重写几GB只需编辑一个值。

  • SQLite是完全事务性的 :它保证你的数据在任何时候都保持一致。 即使你的应用程序(或整个计算机)崩溃,您的数据将自动恢复到上次于未来第一次尝试已知的一致状态,以连接到数据库。

  • SQLite的存储数据逐字 :你不必担心你的数据(包括嵌入在你的字符串零个字节)逃逸垃圾字符-简单地一直使用准备好的语句 ,这一切需要,使之透明。 与文本数据格式,XML特别处理时,这是大和恼人的问题。

  • SQLite的存储以Unicode所有字符串: UTF-8默认)或UTF-16 。 换句话说,你不必担心文本编码或为您的数据格式的国际支持。

  • SQLite的允许你来处理小块(在事实上鳞次栉比)的数据,因此它运作良好,在内存不足的情况 。 这可以是任何基于文本格式的问题,因为他们往往需要将所有的文本加载到内存中解析它。 当然,也有一些有效的基于流的XML解析器在那里,但一般比SQLite的任何XML解析器会相当内存贪婪。



Answer 2:

工作过相当多的与XML和JSON,这是我的两个可伸长的序列化格式,而主观意见:

  • 格式为“标准”:有两个
  • 轻松地与C ++集成:有两种。 在每一种情况下,你可能会以某种库来处理它的风。 在Linux中,libxml2的是一个标准的,并且libxml的++是C为它++包装; 你应该能够得到这两个从你的发行版的软件包管理器。 这将需要一些小的努力让那些在Windows上工作。 有似乎是在加速对JSON的一些支持,但我没有用它; 我一直处理使用JSON库。 说真的,库路径是不是要么非常繁重。
  • 支持表格输入(2d中,n维):是用于两者
  • 支持POD类型:有两种
  • 能否扩大,因为需要更多的投入:是两个 - 这是一个很大的优势,他们两个。
  • 以及绑定变量:如果你的意思是文件本身内部的一些办法说“ 这个数据都必须被自动反序列化到这个变量在我的节目”,那么没有两个。
  • 至于易写(反映),因为它是阅读:取决于你使用的库,但我的经验是两个。 (实际上,你可以做到用printf()写JSON的可容忍的工作。)
  • 非常适用于Windows和Linux:是两个,并且同上Mac OS X中对这一问题。
  • 支持一个文件中引用另一个文件阅读:如果你的意思是类似于一个C的#include,那么XML具有一定的能力做到这一点(例如,文档实体),而JSON没有。
  • 人类可读的:两个通常写入UTF-8,并允许换行和缩进,并且因此可以是人可读的。 不过,我刚刚一直在与这一切都在一行479 KB的XML文件,所以我不得不通过prettyprinter来运行它,以它的意义。 JSON也可以相当难懂,但在我的经验往往比格式化XML更好。

当开始新的项目,我一般喜欢JSON; 这是更紧凑,更可读的。 我可能会选择在JSON XML的主要理由是,如果我是担心接受严重,形成文件,因为XML支持自动文档格式验证,而你必须写使用JSON自己的验证码。



Answer 3:

看看谷歌的缓冲区 。 这种处理您的大多数要求。

从他们的文档 ,高级别步骤如下:

定义在.proto文件消息格式。
使用的协议缓冲编译器。
使用C ++协议缓冲API来写入和读出的消息。



Answer 4:

对于我而言,我觉得要走的路是XML。

  1. 格式是一个标准的,但允许进行修改和灵活性的模式来改变作为程序要求的变化。
  2. 有几个库选项。 一些较大(的Xerces-C)一些较小(ezxml),但也有很多选择,所以我们不会被锁定在单一供应商或非常具体的解决方案。
  3. 它可以支持表格输入(2d中,n维)。 这就需要对“我们”到底有多的解析工作,并有可能对XML最薄弱的环节。
  4. 支持POD类型:绝对的。
  5. 能否扩大,因为需要更多的投入,结合很好的变量等通过模式修改和解析器修改。
  6. 解析速度是不是非常重要的,因此处理文本文件或文件不是问题。
  7. XML可以通过编程写入一样容易阅读。
  8. 非常适用于Windows和Linux或支持C和文本文件的任何其他操作系统。
  9. 支持合成(一个文件中引用另一个文件阅读,等等。)
  10. 人类可读的有很多文本编辑器(卓异,VI等),支持语法高亮开箱。 许多Web浏览器显示的数据良好。

感谢所有伟大的反馈! 我想,如果我们想要一个纯粹的二进制的解决方案,协议缓冲器或升压::序列化是有可能,我们会走的路。



文章来源: “Best” Input File Formats for C++? [closed]