![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Master01 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Всем Доброго Дня,
Есть такая задачка - дан бинарный файл, содержащий значения разного типа - int, float и пр. Структура файла известна, так что когда и что читать ясно. Вопрос в том чем этот файл читать? Потоки ifstream явно для этого не предназначены, потому что всё что я нашёл это чтение символов-байтов через read. А код вида
я как-то писать не расположен
Я не знаю, может так и должно быть... Для меня это просто неожиданность. До этого бинарные файлы читать не приходилось. Может есть способ получше? Заранее Спасибо. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
учитывая тот факт, что файл писался через попу(наверное не вами), странно ожидать удобного его чтения ;)
так что, так вам и придется его читать, через попу ;) Это сообщение отредактировал(а) boostcoder - 30.1.2011, 18:34 |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Открывай поток с модификатором std::ios::binary, читай данные через operator >> (можешь перегрузить его для своих типов данных). Гулять по файлу туда-сюда можно функцией seekg. Выяснить позицию, до которой догулял -- функцией tellg. Ну и так далее. Ничего невозможного здесь нет. |
|||
|
||||
| Master01 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
EnergoHokum, Я просто пробовал читать через operator >>. В результате у меня поток переводился в состояние bad, а в переменную ничего не считывалось. Я, собственно, потому и поднял тему, так как поначалу тоже ожидал, что так должно работать. Может я и ошибаюсь в своих рассуждениях, но, насколько я понимаю, operator >> это форматированный ввод, что не совсем подходит для случая если файл бинарный? Открывал поток, с тем флагом как вы указали. Добавлено через 3 минуты и 36 секунд а, ну да, если перегрузить свой оператор >> , то работать будет, согласен. Мне больше не понятно почему эти операторы уже не перегружены под такие нужды? |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Для бинарного обмена с потоком предназначены функции read и write, их и используйте. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Есть, конечно, именно read и используется. Только если _T это POD. Обычно фиксированный бинарный формат и состоит из нек. кол-ва последовательно записанных POD'ов, возможно, с вариантами. Если влом все время писать sizeof, то используй свой шаблон. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |