Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение бинарного файла 
:(
    Опции темы
Master01
Дата 30.1.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2



Всем Доброго Дня,

Есть такая задачка - дан бинарный файл, содержащий значения разного типа - int, float и пр. Структура файла известна, так что когда и что читать ясно.
Вопрос в том чем этот файл читать? Потоки ifstream явно для этого не предназначены, потому что всё что я нашёл это чтение символов-байтов через read. А код вида

Код

boost::uint16_t chunk_id = 0;
file.read((char*)&chunk_id, sizeof(boost::uint16_t));


я как-то писать не расположен smile. Неужели в ifstrem нету чего-то вроде -

Код

template<typename _T>
void read_numeric(_T& data)
{
   read((char*)&data, sizeof(_T));
}


Я не знаю, может так и должно быть... Для меня это  просто неожиданность. До этого бинарные файлы читать не приходилось.

Может есть способ получше?

Заранее Спасибо.
PM MAIL   Вверх
boostcoder
Дата 30.1.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

Это сообщение отредактировал(а) boostcoder - 30.1.2011, 18:34
PM WWW   Вверх
EnergoHokum
Дата 31.1.2011, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Цитата

Потоки ifstream явно для этого не предназначены, потому что всё что я нашёл это чтение символов-байтов через read

Открывай поток с модификатором std::ios::binary, читай данные через operator >> (можешь перегрузить его для своих типов данных). Гулять по файлу туда-сюда можно функцией seekg. Выяснить позицию, до которой догулял -- функцией tellg. Ну и так далее. Ничего невозможного здесь нет.
PM MAIL ICQ   Вверх
Master01
Дата 31.1.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2



Цитата(EnergoHokum @ 31.1.2011,  08:22)
Цитата

Потоки ifstream явно для этого не предназначены, потому что всё что я нашёл это чтение символов-байтов через read

Открывай поток с модификатором std::ios::binary, читай данные через operator >> (можешь перегрузить его для своих типов данных). Гулять по файлу туда-сюда можно функцией seekg. Выяснить позицию, до которой догулял -- функцией tellg. Ну и так далее. Ничего невозможного здесь нет.


EnergoHokum, Я просто пробовал читать через operator >>. В результате у меня поток переводился в состояние bad, а в переменную ничего не считывалось.
Я, собственно, потому и поднял тему, так как поначалу тоже ожидал, что так должно работать.  
Может я и ошибаюсь в своих рассуждениях, но, насколько я понимаю, operator >> это форматированный ввод, что не совсем подходит для случая если файл бинарный?
Открывал поток, с тем флагом как вы указали.

Добавлено через 3 минуты и 36 секунд
а, ну да, если перегрузить свой оператор >> , то работать будет, согласен. Мне  больше не понятно почему эти операторы уже не перегружены под такие нужды?
PM MAIL   Вверх
xvr
Дата 31.1.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Master01 @  31.1.2011,  14:17 Найти цитируемый пост)
 Мне  больше не понятно почему эти операторы уже не перегружены под такие нужды? 
Они перегружен под нужды текстового (форматированного) чтения. А открытие потока в режиме binary вовсе не означает, что вся работа с ним немедленно станет бинарной. Это всего лишь означает, что система не будет по своему усмотрению никак модифицировать данные, помещаемые (или читаемые) из потока. Например не будет преобразовывать '\n' в '\r\n' (и обратно)

Для бинарного обмена с потоком предназначены функции read и write, их и используйте.


PM MAIL   Вверх
boostcoder
Дата 31.1.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Master01 @  31.1.2011,  14:17 Найти цитируемый пост)
не понятно почему эти операторы уже не перегружены под такие нужды?

наверное потому, что в таком случае станет невозможным определить, как использовать операторы ввода-вывода, для работы с текстовыми или бинарными данными ;)
PM WWW   Вверх
Earnest
Дата 31.1.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Master01 @  30.1.2011,  18:58 Найти цитируемый пост)
Неужели в ifstrem нету чего-то вроде -

template<typename _T>
void read_numeric(_T& data)
{
   read((char*)&data, sizeof(_T));
}

Есть, конечно, именно read и используется. Только если _T это POD. Обычно фиксированный бинарный формат и состоит из нек. кол-ва последовательно записанных POD'ов, возможно, с вариантами. Если влом все время писать sizeof, то используй свой шаблон.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.