nixp.ru v3.0

22 января 2017,
воскресенье,
23:23:47 MSK

DevOps с компанией «Флант»
ivan написал 27 ноября 2004 года в 17:52 (385 просмотров) Ведет себя неопределенно; открыл 4 темы в форуме, оставил 21 комментарий на сайте.

У меня есть небольшая проблема при чтении данных из бинарного файла.

А именно:

У меня есть структура:

struct A{

u_int8 a;

u_int32 b;

}b;

Cумма размеров её элементов составляет пять байт.

Мне нужно считать из файла пять байт и поместить их в эту структуру.

Я делаю так

struct A *c;

u_int8 buf[5];

fread(buf,( вот что здесь написать? ),fd);

c = (A*)buf;

Далее в c->a у меня должен оказаться первый считанный байт, а

в с->b следующие четыре.

Fatal

Я, конечно, не знаю как у вас, но у меня русским языком :) написано (man fread):

size_t

fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t

fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

DESCRIPTION

The function fread() reads nmemb objects, each size bytes long, from the

stream pointed to by stream, storing them at the location given by ptr.

The function fwrite() writes nmemb objects, each size bytes long, to the

stream pointed to by stream, obtaining them from the location given by

ptr.

nmemb — это количество объектов, size — размер одного такого объекта

fread(buf,sizeof(struct A),1,fd);

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

Попробуй, помучий прогу, а потом вопросы задавай

ivan

Я знаю что там всё по русски, один параметр в функции забыл, да и саму её коряво написал, но суть не в этом!

Вот расскажите мне как считать такие вот данные из файла в структуру:

acdb1fff356d4a8ecf1d- это данные из файла в 16-м коде.

В структуру: A{

uint32_t size;

uint8_t mas[2];

uint16_t num;

uint16_t c;

};

В результате должно получиться следующее:

struct A p;

p.size — содержит acdb1fff

p.mas[1] — 35

p.mas[2] — 6d

p.num — 4a8e

p.c — cf1d

ivan

А вот ещё прогу я уже мучаю целую неделю.

Longobard
ivan
Я знаю что там всё по русски, один параметр в функции забыл, да и саму её коряво написал, но суть не в этом!

Вот расскажите мне как считать такие вот данные из файла в структуру:

acdb1fff356d4a8ecf1d- это данные из файла в 16-м коде.

В структуру: A{

uint32_t size;

uint8_t mas[2];

uint16_t  num;

uint16_t  c;

};

В результате должно получиться следующее:

struct A p;

p.size — содержит acdb1fff

p.mas[1] — 35

p.mas[2] — 6d

p.num — 4a8e

p.c — cf1d

хм, а почему нельзя просто пропарсить строку и в хекс? В чем трабла то?

ivan
LONGOBARD
хм, а почему нельзя просто пропарсить строку и в хекс? В чем трабла то?

Хм. А что значит пропарсить строку в хекс?

Вижу я, пока толком не обьяснишь что делаешь, никто не поймёт.

Программка то моя глупенькая и простенькая, всего лишь одну задачу решает — читает данные из mp3 записанные в ID3v2 формате.

Так в ID3v2 всё делится на фреймы, каждый из которых имеет заголовок,

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

Так вот все грабли в том, что каждый третий мудак в своей книжке по С приводит примеры, как записать данные записанные в структуру в файл,

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

Таким образом в итоге мы получаем при стандартном способе чтения (таким как предложил Fatal) полную херню. Короче сами попробуйте

считать предложенные мною данные в структуру (методом Fatal’а)

и поглядите что выйдет.

myst

% info gcc

и найди аттрибут ответственный за выравнивание. Он, кажется, «strict» называется…

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.