ivan
написал 27 ноября 2004 года в 17:52 (947 просмотров)
Ведет себя
неопределенно; открыл 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 следующие четыре.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Я, конечно, не знаю как у вас, но у меня русским языком :) написано (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);
Если два поля записаны в файле друг за другом, то они все попадут в эту структуру, иначе записывай каждое поле отдельно.
Попробуй, помучий прогу, а потом вопросы задавай
Я знаю что там всё по русски, один параметр в функции забыл, да и саму её коряво написал, но суть не в этом!
Вот расскажите мне как считать такие вот данные из файла в структуру:
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
А вот ещё прогу я уже мучаю целую неделю.
хм, а почему нельзя просто пропарсить строку и в хекс? В чем трабла то?
Хм. А что значит пропарсить строку в хекс?
Вижу я, пока толком не обьяснишь что делаешь, никто не поймёт.
Программка то моя глупенькая и простенькая, всего лишь одну задачу решает — читает данные из mp3 записанные в ID3v2 формате.
Так в ID3v2 всё делится на фреймы, каждый из которых имеет заголовок,
где указаны: имя тэга, размер данных содержащихся во фрейме, и всякие флаги. Поэтому ну уж очень хотелось бы читать заголовки фреймов, которые имеют одинаковый формат, в структуру.
Так вот все грабли в том, что каждый третий мудак в своей книжке по С приводит примеры, как записать данные записанные в структуру в файл,
а затем ещё и считать их обратно из файла в структуру, да так чтобы ещё всё и работало. И казалось бы всё хорошо, когда ты сам эти данные туда записываешь, но если это сделали злые люди до тебя и им было с высокой горки насрать, что твой компилятор (gcc) выравнивает в памяти данные так, что они ни как не засунуться в структуру так, как это должно по логике вещей быть.
Таким образом в итоге мы получаем при стандартном способе чтения (таким как предложил Fatal) полную херню. Короче сами попробуйте
считать предложенные мною данные в структуру (методом Fatal’а)
и поглядите что выйдет.
% info gcc
и найди аттрибут ответственный за выравнивание. Он, кажется, «strict» называется…