![]() |
|
Модераторы: bsa |
![]()
|
|
| Steuermann |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
Здравствуйте!
Помогите, пожалуйста, с задачей. Есть бинарный файл. Нужно прочитать из него данные в массив. Проблема в том, что файл может интерпретироваться как последовательность 8, 16 или 32-битных целых чисел. Числа какого типа содержатся в файле заранее не известно. Если бы там были только 8-битные числа, то я бы сделал так:
Подскажите, пожалуйста, как написать с учетом того, что числа могут быть 8, 16 или 32-битные. |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 8 Всего: 146 |
для int аналогично. |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Что вам мешает получить size_of_element как параметр?
|
|||
|
||||
| Steuermann |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
А потом выбирать один из случаев в зависимости от size_of_element? P.S. Забыл сказать, что size_of_element известен после запуска программы (например, вводится с клавиатуры). |
||||
|
|||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Что потом с этим массивом делаете?
|
|||
|
||||
| Steuermann |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
Для начала хотя бы на экран его вывести. |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
а вы темплейты проходили? Может это на них задачка?
Это сообщение отредактировал(а) leniviy - 7.11.2010, 22:19 |
|||
|
||||
| Steuermann |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
leniviy
Спасибо за ответ. Но мне хотелось бы найти более изящное решение. Я тут подумал, нельзя ли всегда выделять память под int (ведь максимальный размер чисел, которые могут быть в файле - 32 бита):
а потом читать из файла в эту память:
Только, наверное, придется делать какие-то преобразования типов. Или так не получится? |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
читайте в байтовый массив, а потом кастуете в массив нужных значений. : int* int_data = (int*)byte_data;
можно, а можно выделять нужное кол-во после того как введут значение размера типа.. судя по фрагментам кода задача на чистом С, а там нет темплейтов.. Это сообщение отредактировал(а) mes - 8.11.2010, 00:33 |
|||
|
||||
| Steuermann |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
mes
Вот так?
Не могли бы Вы рассказать поподробнее, как это сделать? Да, хорошо бы без темплейтов. |
||||
|
|||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Тоже можно, но осторожно
|
||||||
|
|||||||
| Steuermann |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 16.8.2008 Репутация: нет Всего: нет |
xvr
Спасибо Вам большое за совет! Но теперь есть еще одна проблема. Если в двоичный файл записать, например, число FFFB, то после чтения 2-х байт на экран выводится: 65531 вместо ожидаемого числа -5. Как я понимаю, это связано с тем, что int 32-х битный. Если выделять память под short, то все хорошо, выводится -5. Вывожу на экран так:
Подскажите, пожалуйста, как правильно сделать вывод. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
||||
|
|||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
Как-то так:
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |