LINUX.ORG.RU

[c] Дамп структур в файл

 


0

0

Такой неприятный вопрос

Есть массив структур, все поля которых - не ссылки

Тупо сохраняю это в файл

write(file, (char)(a), sizeof(struct s)*a_length); // примерно так

а потом также тупо считываю

read(file, a, sizeof(struct s)*a_length); // примерно так

Все работает, но закрадываются подозрения, что в один прекрасный день может сломаться, поскольку где-то читал про выравнивание данных в памяти, и что так сохранять нельзя

★★★★★

Пихать в файл сишную структуру это быдлокод уровня второго курса провинциального пту. Придумай бинарный формат, сериализуй поля и записывай.

anonymous
()

Проблемы такие:
1. Выравнивание.
2. Представление примитивных типов (порядок байтов например).

В общем использовать это можно только как какой-нибудь кеш, где надо максимизировать скорость доступа и на то, что после обновления программы его прочитать не удастся, наплевать. В остальных случаях надо сериализовать данные в какой-нибудь чётко определённый формат.

PS С такими данными гораздо удобнее и быстрее работать через memory mapped files.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>>Проблемы такие: >>1. Выравнивание. >>2. Представление примитивных типов (порядок байтов например).

понятно. Про порядок байт не подумал

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Ну вот есть у нас int a = 0x1234 Она занимает 4 байта на 32 битной платформе. Если используется x86, то байты будут примерно такие: 0x34 0x12 0x00 0x00. А на другой платформе они будут другие. И там считается из файла не 0x1234 а 0x34120000, а это уже совсем другое число.

Да, в догонку, если использовать типы с неопределённым размером, вроде int, short, то ещё будут и проблемы с разными размерами этих типов.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>>Ну вот есть у нас int a = 0x1234 Она занимает 4 байта на 32 битной платформе...

Ну а если использовать фиксированные типы (кстати, в с есть стандартные фиксированые типы?) и сериализовать в бинарный формат, то, что после десериализации тоже фигня будет получатся в зависимости от архетиктуры?

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

>>тоже фигня будет получатся в зависимости от архетиктуры?

то есть, в зависимости от порядка следования бит?

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

>кстати, в с есть стандартные фиксированые типы?

uint8_t, uint16_t... (C99)

>после десериализации тоже фигня будет получатся в зависимости от архетиктуры?


да

generatorglukoff ★★
()
Ответ на: комментарий от makoven

> то есть, в зависимости от порядка следования бит?

не бит, а байт =)

http://en.wikipedia.org/wiki/Endianness

для фиксированных типов смотрите в /usr/include/stdint.h например.

http://en.wikipedia.org/wiki/Integer_(computer_science)

в файл сохраняйте в выбранном формате - например little-endian. соответственно при сохранении/загрузке на little-endian архитектуре будет простая запись/чтение, а на big-endian - конвертирование перед записью/после чтения.

stpg
()
Ответ на: комментарий от stpg

>>в файл сохраняйте в выбранном формате - например little-endian

А где указывать этот хитрый endian

>>на little-endian архитектуре будет простая запись/чтение, а на big-endian - конвертирование перед записью/после чтения.

автоматически?

makoven ★★★★★
() автор топика
Ответ на: комментарий от generatorglukoff

>>uint8_t, uint16_t... (C99)

из файла stdint.h:

typedef signed char int8_t;

typedef unsigned char uint8_t;

typedef short int16_t;

typedef unsigned short uint16_t;

Те же int, char, etc, только в профиль?

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

> Те же int, char, etc, только в профиль?

не совсем,

Use [u]intN_t if you need exactly N bits.

Since these typedefs are mandated by the C99 standard, they are preferred over rolling your own typedefs.

и ещё почитайте файл /usr/include/sys/types.h. Там можно узнать, что с gcc 2.7 есть атрибуты для указания точного размера

например:

typedef int int16_t __attribute__ ((__mode__ (__HI__)))

stpg
()
Ответ на: комментарий от makoven

> из файла stdint.h:

это на твоей системе такие typedef'ы, на другой машине - может быть другое соответствие. именно поэтому их и придумали.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.