Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“最佳”;C+的输入文件格式+;?_C++_Json_Sqlite_Xml Parsing_File Format - Fatal编程技术网

C++ &引用;“最佳”;C+的输入文件格式+;?

C++ &引用;“最佳”;C+的输入文件格式+;?,c++,json,sqlite,xml-parsing,file-format,C++,Json,Sqlite,Xml Parsing,File Format,我正在着手开发一款新的软件,最终需要一些健壮且可扩展的文件IO。有很多格式。XML、JSON、INI等等。然而,总是有优缺点,所以我想我会要求一些社区的意见 以下是一些粗略的要求: 格式是一个“标准”…如果不需要的话,我不想重新发明轮子。它不一定是一个正式的IEEE标准,但是作为一个新用户,你可以在谷歌上搜索并获得一些关于它的信息,它可能有一些vi以外的支持工具(编辑器)(尽管软件用户通常会精通计算机并乐于使用vi) 容易与C++集成。我不想用一个100mb的库和三个不同的编译器来启动和运行它

我正在着手开发一款新的软件,最终需要一些健壮且可扩展的文件IO。有很多格式。XML、JSON、INI等等。然而,总是有优缺点,所以我想我会要求一些社区的意见

以下是一些粗略的要求:

  • 格式是一个“标准”…如果不需要的话,我不想重新发明轮子。它不一定是一个正式的IEEE标准,但是作为一个新用户,你可以在谷歌上搜索并获得一些关于它的信息,它可能有一些vi以外的支持工具(编辑器)(尽管软件用户通常会精通计算机并乐于使用vi)
  • 容易与C++集成。我不想用一个100mb的库和三个不同的编译器来启动和运行它
  • 支持表格输入(2d、n维)
  • 支持吊舱类型
  • 可以在需要更多输入时扩展,很好地绑定到变量等
  • 解析速度并不十分重要
  • 理想情况下,写(反映)和读一样容易
  • 在Windows和Linux上运行良好
  • 支持合成(一个文件引用另一个要读取的文件,等等)
  • 可读
  • 在一个完美的世界中,我会使用一个只包含头的库或一些干净的STL实现,但如果它运行良好,我可以使用Boost或一些小型外部库

    那么,您对各种格式有何看法?缺点?优势

    编辑

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

    • XML
    • 亚马尔
    • SQLite
    • 谷歌协议缓冲区
    • 推进序列化
    • 伊尼
    • JSON
    退房。这可以处理您的大部分需求

    ,高级步骤是:

    在.proto文件中定义消息格式。
    使用协议缓冲区编译器。

    使用C++协议缓冲API编写和读取消息。

    < P>有一个符合您所有标准的优秀格式:

    SQLite! 请阅读有关使用SQLite作为应用程序文件格式的信息。另外,请参见D.Richard Hipp(SQLite作者)关于这个主题的文章

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

    格式为“标准”

    SQLite已成为大多数移动环境和许多桌面应用程序(Firefox、Thunderbird、Google Chrome、Adobe Reader,随便你说)的首选格式

    轻松与C++集成

    SQLite有,这只是一个源文件和一个头文件。有

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

    SQLite表是您可能想象得到的表格形式。要表示三维数据,请创建包含列
    x、y、z、value
    的表,并将数据存储为一组行,如下所示:

    x1,y1,z1,value1
    x2,y2,z2,value2
    ...
    
    支持吊舱类型

    我猜POD是指普通的旧数据,或BLOB。SQLite允许按原样存储BLOB字段

    可以随着需要更多输入而扩展,与变量绑定良好

    这是它真正闪耀的地方

    解析速度并不十分重要

    但是SQLite的速度非常好。事实上,解析基本上是透明的

    理想情况下,写(反映)和读一样容易

    只需使用
    INSERT
    进行写入,然后使用
    SELECT
    进行读取-有什么更简单的方法

    在Windows和Linux上运行良好

    当然,还有所有其他平台

    支持合成(一个文件引用另一个要读取的文件)

    可以将一个数据库连接到另一个数据库

    人类可读性

    不是二进制的,但是有很多优秀的SQLite浏览器/编辑器。我喜欢Windows和Linux。还有


    SQLite还免费为您提供了其他优势:

    • 数据是可索引的,这使得搜索速度非常快。使用XML、JSON或任何其他纯文本格式都无法做到这一点

    • 即使数据量非常大,也可以部分编辑数据。您不必仅为了编辑一个值而重写几GB

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

    • SQLite一字不差地存储您的数据:您不必担心转义数据中的垃圾字符(包括嵌入字符串中的零字节)-只需始终使用即可,这就是使数据透明的全部条件。在处理文本数据格式(尤其是XML)时,这可能是一个大而恼人的问题

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

    • SQLite允许您以小块(事实上是逐行)的方式处理数据,因此它在低内存条件下运行良好。这对于任何基于文本的格式来说都可能是一个问题,因为它们通常需要将所有文本加载到内存中来解析它。诚然,很少有高效的基于流的XML解析器,但一般来说,与SQLite相比,任何XML解析器都会非常占用内存


    我对XML和json都做了大量工作,以下是我对两者作为可扩展序列化格式的主观看法:

    • 格式是“标准”:两者都是
    • 易于与C++集成:两者都可以。在每种情况下,您都可能会得到某种库来处理它。在Linux上,libxml2是一个stan