gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:17 25 4
gpt4 key购买 nike

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

用户定义字段:

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

如果表 1 中的字段是:姓名、地址、城市、州和 zip 。如何创建可用于从文件读取/写入数据的动态记录结构。

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

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

最佳答案

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

您需要在纸上(或至少在某些评论中)定义和指定您的 file format .您可以使用 EBNF该规范的符号。然后你可以使用 recursive descent parsing读取该文件的技术。您可能更喜欢使用一些 plain text格式,因为它更容易调试。然后你可以阅读每一行(使用 fgetsgetline )并解析每一行(也许还有你的 lexer )。了解 serialization , 它很可能是相关的。

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

如果direct access在你的文件里面是一个问题,考虑使用类似 sqlite 的东西或 GDBM .编码可能更容易。

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

我不完全理解你的应用,但我建议使用 JSONsqlite在其中,使用现有适当的库。因为您的开发时间(和成本)非常重要。

当然,如果您的数据很大(例如,比您的 RAM 大得多,即 TB),您会有不同的关注点和不同的方法。鉴于您的主题(关于人的某种数据;那么您可能会担心 GDPR 并且您肯定对此类数据有一些道德问题,因为在他们不知道有关他们的数据的情况下收集有关他们的数据是不道德的),它不太可能:地球上的人口不到一百亿,而你的每条记录很可能不到 200 字节,所以关于每个活着的人的所有信息都可以放在一个硬盘上。

同时注意 C dynamic memory allocation .您可能需要它。

附言。 Record-oriented files存在于 1970 年代或 80 年代的大型机时代(例如 MVSVMS )。当前的操作系统(阅读 Operating Systems: three easy pieces ),如 Linux、Windows、Unix、Android、MacOSX 都为它们的文件提供字节流抽象,也 directories在他们的 file systems .许多人有DBMS在此之上,或者可能是某种键值抽象(例如 GDBM、Kyoto CabinetREDIS、...)

关于c - 如何读取/写入具有多个未知大小记录结构的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55536909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com