3

我一直能够用 C++ 读写基本的文本文件,但到目前为止,没有人讨论过更多。

我的问题是这样的:

如果我自己开发一种文件类型供我也创建的应用程序使用,我将如何将数据写入文件并保留布局、格式等?是否有任何标准,还是仅取决于程序员的创造力?

4

14 回答 14

3

您基本上必须提出自己的文件格式并编写二进制数据。您还可以序列化您的对象模型并将输出写入文件,但这通常效率较低。

最好使用现有的数据库,或者使用 xml(或其他)来满足简单的需求。如果要以已经存在的格式编写文件,请找到支持它的库。

于 2008-09-16T16:17:58.610 回答
3

您必须知道要创建的文件的二进制文件格式。考虑Joel 关于此主题的帖子:97-2003 文件格式是 349 页规范。

几乎所有时候,为了做类似的事情,你都使用 API 来避免繁重的工作。但是要小心,因为反复试验以及通过反复试验找出“什么有效”可能会导致程序升级破坏您的代码。另外,您必须考虑其他操作系统、次要版本差异、补丁等。

于 2008-09-16T16:19:55.860 回答
2

当然有很多标准。可能使用的是某种 xml,因为已经存在一些库和工具来帮助您使用它,但没有什么能阻止您发明自己的。

于 2008-09-16T16:17:50.200 回答
2

好吧,您可以以您可以阅读的格式存储数据,但可以保持数据的完整性(例如 XML 或 JSON)。

或者(不寒而栗)您可以提出自己的专有二进制格式,并使用它。

于 2008-09-16T16:18:27.640 回答
2

你会像处理文本文件一样使用它。逐字节写入数据,以这样的方式编码,当您阅读文件时,您知道您正在阅读什么。对于电子表格应用程序,您甚至可以使用文本格式(OOXML、OpenDocument)来存储演示和内容信息。

或者您可以定义二进制数据结构并将其直接写入文件。

选择文本格式还是二进制格式取决于应用程序。对于配置文件,您可能更喜欢可以在应用程序外部修改的文本文件,对于数据库,出于性能原因,您很可能会选择二进制格式。

于 2008-09-16T16:19:13.490 回答
1

有关各种文件类型的文件格式的信息,请参阅wotsit.org。示例:您可以准确了解如何写出 .BMP 文件以及它是如何组成的。

可以通过使用您的语言中的包装类来写入数据库,主要是向其传递 SQL 命令。

于 2008-09-16T16:20:48.213 回答
0

自定义数据的典型二进制文件格式是“索引文件格式”,包括

--------
|索引|
--------
|数据 |
--------

索引包含“指向”数据的记录。

索引由包含偏移量和大小的记录组成。偏移量告诉您数据存储在文件中的哪个位置,大小告诉您该偏移量处的数据大小(即要读取的字节数)。

类型定义结构{
  size_t 偏移量
  size_t 大小
} 指数

类型定义结构{
  整数ID
  字符优先[20]
  字符最后[20]
  字符 *随机信息
} 数据

假设您想在文件中存储 50 条记录,您将创建 50 个索引和 50 个数据结构。50 个索引结构将首先写入文件,然后是 50 个数据结构。

要读取文件,您将在 50 个索引结构中读取,然后从读取的索引结构中的数据中,您可以知道在哪里“寻找”来读取数据记录。

查找(fopen、fread、fwrite、fclose、ftell)读取/写入数据的函数。

(对不起,我的分号键不起作用)

于 2008-12-20T02:24:40.153 回答
0

如果您创建一个二进制文件,您可以向其中写入任何文件。唯一的缺点是你必须确切地知道它从哪里开始和在哪里结束。

于 2008-09-16T16:16:56.240 回答
0

您通常使用第三方库来处理这些事情。例如,您将链接到一个数据库库,例如 Oracle,它允许您与数据库对话。因为底层文件类型(即 Excel 电子表格与 Openoffice、Oracle 与 MySQL 等)不同,这些库抽象出您需要关心文件是如何构建的。

希望能帮助你找到你要找的东西!

于 2008-09-16T16:17:48.267 回答
0

使用 xml(开放的、描述性的和可验证的),并坚持使用文本。这类事情也有标准,包括ODF

于 2008-09-16T16:21:25.577 回答
0

您可以将文件作为二进制文件打开,而不是文本文件(这在某种程度上取决于平台),从那里您可以将数据直接写入磁盘。唯一真正需要注意的是endianess,当将文件从一种架构移动到另一种架构(例如 x86 到 PPC)时,这可能会成为一个问题。

将二进制数据写入磁盘实际上并不比写入文本更难,而且确实,您的创造力是存储数据的关键。

于 2008-09-16T16:21:52.157 回答
0

一般问题通常被称为应用程序状态的序列化,在您的情况下,文件的源/目标以任何对您有意义的格式。这些天来,首选的输入/输出格式是 XML,您可能想查看该领域的现有标准。那么问题就变成了我如何从我的系统状态映射到特定的模式。Boost 有一个序列化框架,你可能想看看。

/艾伦

于 2008-09-16T16:22:24.323 回答
0

您可以采用多种方法,但通常您需要某种序列化库。BOOST::Serialization 或Google 的 Protocal Buffers就是一个很好的例子。基本思想是您拥有表示数据的内存结构(类和对象),并且您希望以可用于再次重建这些结构的方式将该数据写入文件。

如果您对使用库犹豫不决,您可以手动完成所有操作,但要意识到您最终可能会编写大量冗余代码,或者开发自己的库。请参阅fopen、fread、fwrite 和 fclose作为起点。

于 2008-09-16T16:27:46.900 回答
0

1985 打来电话,说他们有一些帮助 IFF 你愿意读起来。交换文件格式今天仍在使用,并提供一些关于二进制文件的基本元数据,例如 RIFF 或 WAV 音频。(不幸的是,TIFF 是一个假朋友。)据称它甚至启发了 PNG,所以它不会那么糟糕。

于 2014-04-08T03:07:41.190 回答