将更多内容写入文件而不仅仅是纯文本

时间:2008-09-16 16:15:24

标签: file

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

我的问题是:

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

14 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

您必须知道要创建的文件的二进制文件格式。考虑Joel's post on this topic:97-2003文件格式是349页规范。

几乎所有的时间,为了做这样的事情,你使用API​​,以避免咕噜咕噜的工作。但是要小心,因为反复试验并通过反复试验找出“什么有用”会导致程序升级,从而破坏您的代码。另外,您必须考虑其他操作系统,次要版本差异,补丁等。

答案 2 :(得分:2)

当然有很多标准。可能使用的是xml的一些风格,因为已经有一些库和工具可以帮助你使用它,但没有什么能阻止你发明自己的。

答案 3 :(得分:2)

您可以将数据存储在您可以阅读的格式中,但这样可以保持数据的完整性(例如XML或JSON)。

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

有关各种文件类型的文件格式的信息,请参阅wotsit.org。示例:您可以确切地弄清楚如何写出.BMP文件及其组成方式。

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

答案 6 :(得分:0)

如果您创建二进制文件,则可以向其写入任何文件。唯一的缺点是你必须确切知道它的起始位置和结束位置。

答案 7 :(得分:0)

您通常会使用第三方库来处理这些事情。例如,您可以在数据库库中链接说Oracle,以便与数据库进行通信。因为底层文件类型(即Excel电子表格与Openoffice,Oracle与MySQL等)不同,所以这些库抽象了您需要关心文件的构造方式。

希望能帮助您找到所需内容!

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

一般问题通常被称为应用程序状态的序列化,在您的情况下,文件的源/目标以任何对您有意义的格式。目前,首选的输入/输出格式是XML,您可能希望查看此字段中的现有标准。然后问题变成如何从我的系统状态映射到特定模式。 Boost有一个您可能想要查看的序列化框架。

/阿伦

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

自定义数据的典型二进制文件格式是由

组成的“索引文件格式”
-------
|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)读取/写入数据的函数。

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

答案 13 :(得分:0)

1985年打来电话,并表示他们有一些帮助你愿意阅读的IFF。 interchange file format目前仍在使用,并提供围绕二进制文件的一些基本元数据,例如RIFF或WAV音频。 (不幸的是,TIFF是一个虚假的朋友。)它allegedly甚至启发了PNG,所以它不会那么糟糕。