Как записать динамически размещенную структуру в файл - PullRequest
1 голос
/ 29 октября 2010

У меня сложная структура в программе на Си, в которой много членов, которым динамически выделяется память. Как мне записать эту структуру в текстовый / бинарный файл? Как я смогу воссоздать всю структуру из данных, прочитанных из файла.

struct parseinfo{
 int  varcount;
 int  termcount;
 char **variables;
 char **terminals;
 char ***actions;
};

Переменные-члены, терминалы и действия распределяются динамически, и мне нужно записать эту структуру в файл, чтобы потом можно было восстановить структуру.

Ответы [ 4 ]

4 голосов
/ 29 октября 2010

Вы должны записать в эту структуру Сериализовать и Десериализовать функции, вы не можете записать эту структуру в файл как необработанные данные, потому что вы разместили указатели в куче, а это не делает смысл сохранять эти значения в файле.

2 голосов
/ 29 октября 2010

Коротко: не автоматически.

По сути, это сильно зависит от семантики вашей структуры.Если поля данных внутри определяют длину определенных массивов внутри, вы можете восстановить структуру.Но вы должны быть осторожны, чтобы «поверить» ценностям.(возможная причина переполнения стека (хорошее слово)), если вы считаете, что в массиве 2 ^ 34 записи.Но в остальном все просто так (боль)

Вы можете немного поискать ASN.1 и TLV-структуры.

1 голос
/ 29 октября 2010

Вот несколько предложений для двоичной сериализации:

Вы можете сериализовать строку либо в стиле C (напишите завершающий '\ 0'), либо записав размер (скажем, int), за которым следует содержимое.

Вы можете сериализовать массив строк, записав длину массива, за которой следуют строки.

Если возможно, что вы десериализовали файл в другой архитектуре (другой размер int, другойendianness ...), затем позаботьтесь о том, чтобы тщательно указать двоичный формат файла.В таком случае вы можете взглянуть на стандарт XDR сериализации.

Для сериализации ASCII мне нравится формат JSON .

0 голосов
/ 29 октября 2010

Я бы посоветовал сделать это, прежде всего, подумать, что нужно для создания предметов?

Когда дело доходит до char **variables; char **terminals; char **actions, вам, очевидно, придется выяснить, как их объявлять и читать, но я не думаю, что вы можете вставить / 0 в файл (символ EOF ??)

Как бы вы хотели, чтобы это было записано в файл? Можете ли вы предоставить пример вывода, как вы думаете, его следует хранить? Возможно, один элемент на строку в файле? Это должен быть бинарный файл?

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