向文件中写入的内容不只是纯文本

时间:2020-03-05 18:56:27  来源:igfitidea点击:

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

我的问题是这样的:

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

解决方案

回答

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

回答

通常,我们使用第三方库来处理这些事情。例如,我们将链接到数据库库中,例如说Oracle,它将允许我们与数据库进行对话。由于基础文件类型(即Excel电子表格与Openoffice,Oracle与MySQL等)不同,因此这些库抽象出了我们需要关心文件构造方式的需求。

希望能找到想要的东西!

回答

当然有很多标准。可能使用的是某种xml风格的,因为已经存在可以使用它的库和工具,但是没有什么阻止我们发明自己的库。

回答

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

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

回答

好吧,我们可以将数据存储为可读的格式,但可以保持数据的完整性(例如XML或者JSON)。

或者,(颤抖)我们可以提出自己的专有二进制格式,并使用它。

回答

我们将以与文本文件完全相同的方式进行处理。逐字节写入数据,编码方式使我们在读取文件时就知道所读取的内容。
对于电子表格应用程序,我们甚至可以使用文本格式(OOXML,OpenDocument)来存储演示文稿和内容信息。

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

文本或者二进制格式之间的选择取决于应用程序。对于配置文件,我们可能更喜欢可以在应用程序外部进行修改的文本文件;对于数据库,出于性能原因,我们很可能会选择二进制格式。

回答

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

几乎总是使用API​​来执行类似的操作,以避免繁琐的工作。但是要小心,因为反复试验并通过反复试验弄清楚"什么起作用"会导致程序升级,从而破坏代码。另外,我们还必须考虑其他操作系统,次要版本差异,补丁程序等。

回答

有关各种文件类型的文件格式的信息,请参见wotsit.org。示例:我们可以确切地知道如何写出.BMP文件以及它是如何组成的。

可以通过使用我们语言的包装器类(主要是向其传递SQL命令)来完成对数据库的写入。

回答

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

回答

我们可以将文件打开为二进制文件,而不是文本文件(这在某种程度上取决于平台),然后可以从那里将数据直接写到磁盘上。唯一真正需要注意的是耐久性,当将文件从一种体系结构迁移到另一种体系结构(例如x86到PPC)时,这可能会成为问题。

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

回答

一般的问题通常被称为应用程序状态的序列化,在这种情况下,使用文件源/目标对我们来说有意义的任何格式。如今,首选的输入/输出格式是XML,我们可能需要研究该领域中的现有标准。然后,问题就变成了如何从系统状态映射到特定架构。 Boost具有我们可能需要检出的序列化框架。

/艾伦

回答

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

如果我们不愿意使用库,则可以手动完成所有操作,但要意识到最终可能会编写大量冗余代码,或者开发自己的库。有关起点,请参见fopen,fread,fwrite和fclose。

回答

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

-------
|index|
-------
|data |
-------

索引包含记录的地方"指向"数据。

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

typedef struct {
  size_t offset
  size_t size
} Index

typedef struct {
  int  ID
  char First[20]
  char Last[20]
  char *RandomInfo
} Data

假设我们要在文件中存储50条记录,则将创建50个索引和50个数据结构。首先将50个索引结构写入文件,然后再写入50个数据结构。

要读取文件,我们将在50个索引结构中读取,然后从读入的索引结构中的数据中,我们可以知道在哪里"搜索"以读取数据记录。

查找(fopen,fread,fwrite,fclose,ftell)以获取读取/写入数据的功能。

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