【问题标题】:Concatenating text and binary data into one file将文本和二进制数据连接到一个文件中
【发布时间】:2017-08-07 16:35:47
【问题描述】:

我正在开发一个应用程序,我有几条数据希望能够保存到同一个文件并从同一个文件中打开。第一个是几行本质上是人类可读的,用于存储有关某些属性的简单数据。数据存储在支持operator<<operator>>AttributeList 对象中。其余的是我已加载到内存中的 .png 图像。

如何将所有这些数据保存到一个文件中,以便我可以轻松地将其读回内存?有没有办法将图像数据存储在内存中让这更容易?

【问题讨论】:

  • 为什么要将图像与属性放在同一个文件中?这样做似乎是糟糕的设计。是有原因还是为了简单?
  • @EastonBornmeier 我希望用户能够打开包含所有数据的单个文件。我希望用户可以简单地相互共享文件,而不必担心将多个文件放在一个项目中。
  • 为什么不使用 zip 或 tar 文件?
  • 您可以更改扩展名。获取应用程序以解压缩它。 Word 文档是 xml 压缩文件
  • 有很多“秘密”的 ZIP 文件格式:较新的 Microsoft Office 文档(扩展名末尾带有 x 的文件),主要竞争办公套件的格式LibreOffice 或 OpenOffice、EPUB 文件(一种流行的电子书格式),甚至是 Java 的 JAR 文件。用户不需要关心差异,除非您希望他们能够在文本编辑器中打开文件并自己编辑人类可读的部分。

标签: c++ file-io binaryfiles


【解决方案1】:

我怎样才能以这样一种方式将所有这些数据保存到一个文件中 轻松将其读回内存?有没有办法存储图像 内存中的数据会使这更容易吗?

是的。

在我曾经工作过的嵌入式系统中,要求是将系统配置捕获到 ram 文件系统中。 (1 兆字节)

我们使用 zlib 将多个文件压缩并“合并”成一个存储文件。

也许任何压缩系统都可以为您工作。在 Linux 上,我会使用 popen() 来运行 gzip 或 gunzip 等。


2017-08-07 更新

在我的 popen 演示中(针对这个问题),我使用标准 shell 命令构建命令字符串:

std::string cmd;
cmd += "tar -cvf dumy514DEMO.tar dumy*V?.cc ; gzip dumy514DEMO.tar ; ls -lsa *.tar.gz";
//      tar without compression             ; next do compress

然后构造我的 popen-wrapped-in-a-class 实例并调用 popen 读取操作。通常对用户的反馈很少(就像 UNIX Philosophy 的风格,即没有成功消息),所以我包括(对于这个演示) -v (用于详细选项)。结果反馈列出了 4 个 tar 文件,我列出了生成的 .gz 文件。

dumy514V0.cc
dumy514V1.cc
dumy514V2.cc
dumy514V3.cc
8 -rw-rw-r-- 1 dmoen dmoen 7983 Aug  7 17:23 dumy514DEMO.tar.gz

目录列表中的 sn-p 显示了我的可执行文件、源代码和新创建的 tar.gz。

-rwxrwxr-x  1 dmoen dmoen 86416 Aug  7 17:18 dumy514DEMO
-rw-rw-r--  1 dmoen dmoen 13576 Aug  7 17:18 dumy514DEMO.cc
-rw-rw-r--  1 dmoen dmoen  7983 Aug  7 17:23 dumy514DEMO.tar.gz

如您所见,tar.gz 大约有 8000 字节。这 4 个文件增加了大约 70,000 个字节。

【讨论】:

  • 使用程序库可能比调用popen 更好,而且如果需要,几乎可以肯定更容易在 Linux 和 Windows 之间移植。
  • 我很容易在网上找到了一个 Windows '_popen()'。我停止尝试在 Ubuntu 15.10 上编译它,在大约第 5 个无法解决的错误之后使用 g++v5。
  • 这就是为什么我说使用库可能会更好。我至少需要 5 个无法解决的错误才能让外部程序在 Windows 上运行,但我可以很容易地为 Linux 编写代码。图书馆更有可能只在它声称可以工作的任何地方工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多