向文件中写入的内容不只是纯文本
我一直能够用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)以获取读取/写入数据的功能。
(对不起,我的分号键不起作用)