|
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 35
|
||||||
Открытие бинарного файла для чтения22.06.2011, 11:49. Показов 61200. Ответов 13
Метки нет (Все метки)
MS VS 2010
Есть функция, ей передаётся имя бинарного файла для чтения:
0
|
||||||
| 22.06.2011, 11:49 | |
|
Ответы с готовыми решениями:
13
Открытие файла для чтения/записи Ошибка чтения из бинарного файла
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 22.06.2011, 12:07 | |
|
Логично. Для чтения нужно использовать ifstream.
1
|
|
|
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 35
|
||||||
| 22.06.2011, 12:40 [ТС] | ||||||
|
Поправил, но теперь обнаружил, что файл не открывается
1
|
||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 22.06.2011, 12:44 | |
|
Удали строку 8.
Добавлено через 1 минуту Вместо f.write((char*)&c, sizeof(int)); можно просто f << c; Добавлено через 1 минуту И вместо f.read((char*)&c, sizeof(int)); можно f >> c;
2
|
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 22.06.2011, 12:52 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
О Боже! Когда ж вы книжки-то читать начнете!!!!
Обычно различают текстовые и двоичные файлы. Текстовые файлы состоят из строк, которые завершаются символом «конец строки». В программе на С++ этот символ обозначается как ‘\n’. ПРИМЕЧАНИЕ В системе Windows строки в текстовом файле завершаются комбинацией двух байтов 0x0D0A, поэтому при операциях ввода/вывода система выполняет преобразование. Обычно операции обмена с текстовым файлом сопровождаются преобразованием информации аналогично тому, как это происходит для стандартных потоков. Двоичные файлы не разбиваются на строки, и никаких преобразований при обмене не выполняется. Это, во-первых, означает, что операции обмена для двоичных файлов выполняются быстрее. А во-вторых, при операции записи в двоичный файл попадает ровно столько байтов, сколько записываемый объект занимает в памяти. Например, целое число, записанное в двоичный файл, займет на диске sizeof(int) байтов. Это существенно отличается от записи в текстовый файл, где количество записываемых по умолчанию символов зависит от величины числа. Например, число 12 в текстовом файле займет 2 или 3 байта (в зависимости от того, выводится ли число со знаком или без него), а 123456 — 6 или 7 байтов. А при явном указании в спецификаторе формата ширины поля — еще больше! Примером двоичного файла является файл выполняемой программы (с расширением .exe). Двоичные файлы Вывод в двоичные файлы обычно выполняется методом write(), который мы уже рассматривали выше при выводе символов и строк. Все же обычно с его помощью выводят как раз не символы, а данные других типов. Метод имеет прототип
Метод делает то же самое, что и функция fwrite() библиотеки <cstdio>. Используя преобразование указателей, можно вывести в выходной двоичный поток значение переменной любого типа, например
Метод работает так же, как и соответствующая функция fread() из библиотеки <cstdio>. Используя преобразование указателей, можно ввести из входного двоичного потока значение переменной любого типа, например
Теперь легко переписать примеры (см. листинг 10.12) обработки двоичных файлов. В первом примере мы создаем два двоичных файла из одного массива (листинг 10.27).
Затем те же файлы открываются как входные, читаются и выводятся на экран. Сначала открывается файл oonumber2.bin (в который мы писали массив целиком), и чтение из него выполняется по одному числу. На экране видно, что чтение выполняется совершенно правильно. Первый файл oonumber1.bin, который записывался в цикле по одному числу, читается сразу целиком в массив t, одним оператором, и поток тут же закрывается. И снова мы наблюдаем на экране, что чтение выполнилось совершенно правильно. Копирование и дозапись двоичных файлов можно выполнить той же функцией filecopy(), открыв потоки как двоичные, например
ПРИМЕЧАНИЕ Существует гораздо более простой и быстрый способ копирования файлов, который мы рассмотрим далее при изучении буферизации. Произвольный доступ Как уже было сказано выше, С++ позволяет выполнять позиционирование в любых потоках, кроме стандартных. Методы позиционирования приведены в табл. 10.11. Методы позиционирования различаются для входных и выходных потоков: для входных потоков имена [1-27.6.1.3] методов заканчиваются символом ‘g’ (от слова get), а методы выходных потоков [1-27.6.2.4] заканчиваются символом ‘p’ (от слова put). Таблица 10.11. Методы позиционирования Метод Описание
Функции установки относительной позиции практически не отличаются от функции fseek() библиотеки <cstdio>. В классе ios_base определены константы [1 27.4.2.1.5]
Этот пример, кроме всего прочего, показывает, что файл number2.bin, записанный функциями библиотеки <cstdio> (см. листинг 10.12), без всяких проблем читается и перезаписывпается средствами объектно-ориентированной библиотеки. Более того, даже двоичный файл, записанный средствами языка Pascal можно без проблем обрабатывать в программе на С++. Это естественно, так как файлы — прерогатива операционной системы, а не С++. Программа должна только правильно связать поток с нужным файлом. Например, в С++, в отличие от языка программирования Pascal, отсутствуют файлы с записями (file of type). В языке Pascal такие файлы являются двоичными и состоят из записей. Записи нумеруются, начиная с нуля, что обеспечивает прямой доступ к записи. Такие файлы по умолчанию открываются в режиме чтения/записи. Мы вполне можем обработать такие файлы и обеспечить прямой доступ к записям по номерам средствами С++. Для этого нужно объявить в программе структуру, имеющую поля соответствующих типов, заданные в том же порядке, как в записи в программе на Pascale. Здесь нужно внимательно отнестись к проблеме выравнивания — структура в С++ должна иметь точно такой же размер, что и запись в Pascal. Далее нужно открыть файл как двоичный в режиме чтения/записи. Чтение из файла выполняется оператором
Методы относительного позиционирования позволяют реализовать прямой доступ к записям двоичного файла. Например, позиционирование на k-ю запись для чтения выполняется оператором
20
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 35
|
|
| 22.06.2011, 12:53 [ТС] | |
|
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 22.06.2011, 12:58 | ||
|
0
|
||
|
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 35
|
||
| 22.06.2011, 12:59 [ТС] | ||
|
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
| 22.06.2011, 13:00 | |
|
1
|
|
|
1 / 1 / 1
Регистрация: 11.03.2011
Сообщений: 35
|
|
| 22.06.2011, 13:03 [ТС] | |
|
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 22.06.2011, 13:11 | |
|
Я в шоке! Нельзя для бинарных файлов <<, >> использовать. А так хотелось. Пичалька.
0
|
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||||||||||||||||||||||||||||||||||||||||||||||
| 22.06.2011, 13:44 | |||||||||||||||||||||||||||||||||||||||||||||||
|
Вот небольшой текст по этому поводу: Ввод/вывод объектов в двоичные файлы При изучении процедурной библиотеки ввода/вывода мы рассмотрели вопрос о размерах структуры при записи на диск (см. листинг 10.13). Однако «за кадром» остался важный вопрос: влияет ли наличие виртуальных функций на размер выводимого объекта? Кроме того, нужно разобраться, каким образом организовать вывод информации из контейнера во внешний файл. Разберемся сначала с первым вопросом, написав простейший пример (листинг 10.28).
Никто не знает структуру объекта лучше, чем сам объект. Поэтому, если требуется сохранять объект на диске, можно в классе реализовать два метода: save() и load(). Методы save() и load(), очевидно, должны быть симметричны — процесс сериализации должен быть обратим. Эти методы должны работать с полями объекта. Например, для класса TDate (листинг 10.35)
Один из вариантов реализации методов save()/load() представляет собой инструмент для создания «моментального снимка» объекта во внешней памяти, который в дальнейшем можно восстановить. Прототипы методов выглядят просто:
Функции метода save() понятны, и написать его несложно. Единственная проблема — передать информацию об имени файла в метод load(). Это проще всего сделать, определив поле-строку в классе в соответствии с требованиями функции tmpnam(). Тогда метод save() будет заносить в это поле сгенерированное имя, а метод load() будет открывать файл с этим именем. Ввод/вывод скалярных объектов относительно прост, так как поля в классе известны и занимают фиксированное количество байт. Значительно сложнее написать сериализацию динамических контейнеров, ведь требуется выводить не указатели, а значения, записанные в динамической памяти. Например, для динамического массива TArray (листинг 9.1) требуется выводить, как минимум, поле Count и содержимое динамического массива, расположенного по адресу, записанному в elems. Реализуем методы для класса-шаблона TArray (листинг 10.39). Если метод save() написать относительно просто, то метод load() требует более пристального внимания. Метод похож на операцию присваивания: нужно создать новый динамический массив, в который скопировать сохраненные данные, а прежний массив уничтожить. Таким образом, метод save() должен сохранить поле Size, поле Count и сами элементы.
Если нам нужна возможность ввода/вывода объектов в произвольный файл, то нужно передавать методам save()/load() в качестве параметра поток, связанный с этим файлом, например
Можно пойти дальше, и реализовать независимую библиотеку сериализации. Одна из библиотек Boost так и называется Serialization — библиотека сериализации объектов. Это сложная профессиональная работа, использующая нетривиальные возможности шаблонов, RTTI и множественное наследование Вместо save и load - и перегрузите... ![]() Или как внешюю функцию.
1
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 22.06.2011, 13:50 | |
|
Писать что-то ручками? Ну уж спасибо, у меня есть boost::serialization.
Потому я про эту "особенность" и не помню, что напрямую с потоками не помню когда общался.)
0
|
|
|
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 17
|
||||||
| 26.02.2021, 15:23 | ||||||
|
Добрый день, уважаемые форумчане. Нужно создать текстовый файл, в который записать количество строк и столбцов
двумерной матрицы, и затем содержимое текстового файла переписать в бинарный файл. Вроде сделал так, как в постах выше, но почему-то в бинарный файл записывается только одно число? Буду признателен за помощь.
0
|
||||||
| 26.02.2021, 15:23 | |
|
Помогаю со студенческими работами здесь
14
Открытие файла для чтения Открытие файла для чтения и записи Открытие файла для чтения. VB2017
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|