如何读取/写入具有多个未知大小记录结构的文件

时间:2019-04-05 13:50:58

标签: c

我正在开发一个应用程序,该应用程序可以在用户创建的不同UI窗体上具有用户定义的数据字段。我的问题是,当我不知道用于创建“结构”代码或数据大小的结构时,如何读写这些数据记录。我唯一需要知道的信息是用户提供的字段声明信息,以便可能确定记录大小,但是鉴于数据的长度,该信息也会有所不同。

用户定义字段:

Field Type: String (char *)
Field Name: fldFirstName
Field Caption: First Name

如果表格1上的字段为:姓名,地址,城市,州和邮政编码。如何创建一个动态记录结构,该结构可用于从文件读取数据/从文件读取数据。

struct _dynamic_ {
    char *Name;
    char *Address;
    char *City;
    char State[2];
    char Zip[10];
}

为清楚起见,我了解如何读取/写入文件,但是在没有给定“结构”为用户创建的每种表单定义数据的情况下,我还没有弄清楚如何解决此问题。任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

<stdio.h>中的文件(即FILE*句柄)没有任何记录结构。它们只是字节流。甚至fread都在读取字节(以给定size的某个倍数),但通常 you 您可以决定是“记录”。

您需要在纸上(或至少在某些注释中)定义和指定file format。您可以为该规范使用EBNF表示法。然后,您可以使用recursive descent parsing技术来读取该文件。您可能更喜欢使用某些plain text格式,因为它更易于调试。然后,您可以读取每一行(使用fgetsgetline)并解析其中的每一行(也许也有lexer)。阅读有关serialization的信息,可能与之相关。

请记住,计算机速度非常快,RAM总是比磁盘快得多(即使它是SSD)。您可能更喜欢使用现有的文本格式,例如JSONYAML,XML,因为您会很容易找到现有的库来处理这些格式。请记住,数据处理的成本通常比I / O的成本小得多。

如果您担心文件中的direct access,请考虑使用sqliteGDBM之类的东西。编写代码可能会更容易。

在许多情况下,数据的成本(或货币价值)比处理数据的软件成本更为重要。不要忘记备份数据。

我不确定您的应用程序是什么,但是我建议使用现有适当的库在其中使用JSONsqlite。由于您的开发时间(和成本)非常重要。

当然,如果您的数据量巨大(例如,比RAM大得多,那么太字节了),您将有不同的关注点和不同的方法。给定您的主题(某种有关人的数据;那么您可能会担心GDPR,并且您肯定会对此类数据有一些道德问题,因为在不了解有关人员的数据的情况下收集有关人员的数据是不道德的) ,这不太可能:地球上的人口少于100亿,您的每条记录都可能少于200字节,因此有关每个活人的所有信息都放在一个硬盘上。

还要注意C dynamic memory allocation。您可能需要它。

PS。 Record-oriented files存在于1970年代或1980年代的大型机时代(例如MVSVMS)。当前的操作系统(阅读Operating Systems: three easy pieces),例如Linux,Windows,Unix,Android,MacOSX,都为其文件以及directories中的file systems提供了字节流抽象。许多人都在DBMS之上,或者也许是某种键值抽象(例如GDBM,Kyoto CabinetREDIS等)