Как прочитать / записать файл с несколькими структурами записи неизвестного размера - PullRequest
0 голосов
/ 05 апреля 2019

Я работаю над разработкой приложения, которое может иметь пользовательские поля данных в различных формах пользовательского интерфейса, созданных пользователем.Моя проблема в том, как мне читать / записывать эти записи данных, когда я не знаю структуру, чтобы создать «структурный» код или размер данных.Единственная информация, которую я хотел бы получить, - это информация об объявлении поля, предоставленная пользователем для возможного определения размера записи, но она также будет варьироваться в зависимости от длины данных.

Определяемое пользователем поле:

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 Ответ

2 голосов
/ 05 апреля 2019

Файлы (то есть FILE* дескрипторы) из <stdio.h> не имеют структур записи. Они просто поток байтов. Даже fread читает байты (в некотором кратном заданному size), но условно , вы могли бы решить они "записи ».

Вам необходимо определить и указать на бумаге (или хотя бы в каком-либо комментарии) ваш формат файла . Вы можете использовать нотацию EBNF для этой спецификации. Тогда вы могли бы использовать методы рекурсивного спуска для чтения этого файла. Вы можете предпочесть какой-нибудь формат в формате обычного текста , потому что его легче отлаживать. Затем вы можете прочитать каждую строку (с помощью fgets или getline) и проанализировать каждую из них (возможно, также имея свой лексер ). Читайте про сериализацию , скорее всего это будет актуально.

Помните, что компьютеры работают очень быстро, а оперативная память всегда намного быстрее вашего диска (даже если это SSD). Вы можете предпочесть использование существующих текстовых форматов, таких как JSON , YAML , XML, потому что вы легко найдете существующие библиотеки для работы с ними. Помните, что стоимость обработки данных довольно часто намного меньше, чем стоимость ввода / вывода.

Если прямой доступ внутри вашего файла вызывает беспокойство, попробуйте использовать что-то вроде sqlite или GDBM . Код может быть проще.

Во многих случаях стоимость (или денежная стоимость) данных важнее стоимости программного обеспечения, обрабатывающего их. Не забудьте сделать резервную копию ваших данных.

Я не совсем понимаю ваше приложение, но я бы порекомендовал использовать в нем JSON или sqlite , используя существующие соответствующие библиотеки. Поскольку ваше время разработки (и стоимость) имеет большое значение.

Конечно, если ваши данные огромны (например, намного больше, чем ваша RAM, терабайт), у вас будут другие проблемы и разные подходы. Учитывая вашу тему (какие-то данные о людях; тогда вы можете быть обеспокоены GDPR , и у вас наверняка есть некоторые этические вопросы относительно таких данных, так как неэтично собирать данные о людях, не зная о данных, касающихся их), это маловероятно: нас меньше десяти миллиардов человек на земле, и каждая из ваших записей, вероятно, меньше 200 байтов, поэтому вся информация о каждом живом человеке помещается на одном жестком диске.

Также помните о C динамическом распределении памяти . Вам, вероятно, это нужно.

PS. Ориентированные на запись файлы существовали в эпоху мэйнфреймов (например, MVS , VMS ) в 1970-х или 1980-х годах. Современные операционные системы (читай Операционные системы: три простых компонента ), такие как Linux, Windows, Unix, Android, MacOSX, предоставляют абстракцию потока байтов для своих файлов, а также каталоги в их файловых системах . У многих СУБД выше этого или, возможно, какая-то абстракция значения ключа (например, GDBM, Киотский кабинет , REDIS , ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...