![]() |
|
Модераторы: bsa |
![]()
|
|
| Shmell |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
Здравствуйте! Хочу открыть файл для чтения в двоичном (не преобразующем) режиме для работы с ним, как с последовательностью нулей и единиц.
Для этого надо поставить в вызове параметры r - для чтения и b - двоичный режим. Написал вот так:
Правильно ли это? Как надо пристыковать b? Добавлено через 4 минуты и 32 секунды Компилятор на такое заполнение не ругается. Добавлено через 11 минут и 20 секунд Гм, посмотрел в Википедии, вроде бы правильно все написал... |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
||||
|
||||
| KaZepKa |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
||||
|
||||
| Shmell |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
ты так никогда его не откроешь. Потому что нет такого режима. двоичный режим - это режим, при котором комбинация символов "\r\n" не преобразуется к "\n". И все. Более того, этот режим существует только для операционок производства Microsoft и аналогов. В мире unix такого режима нет. Чтобы получить набор нулей и единиц, ты должен читать байты из файла, а затем вручную преобразовывать в двоичную форму (читай про операторы << и &). |
|||
|
||||
| Shmell |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
bsa, и как это можно организовать???
Добавлено через 8 минут и 27 секунд
Вот я создал массив textbuf, состоящих из элементов BYTE (размер которых = 1 байт). Считал в этот массив файл. Т.е. я вроде как разбил файл на байты. Иначе говоря, я должен получить массив, в котором содержатся байты файла по одному. bsa, этого достаточно, чтобы считать законченным первый этап манипуляций, указанных Вами:
? |
||||
|
|||||
| Shmell |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
А по поводу второго этапа, есть вот такая функция:
Добавлено через 22 секунды Она подойдет? |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Где-то здесь затаилась нестыковочка))))
Не совсем так. Не всё))) В двоичном режиме чтение файла не прерывается символом '\0' Это абсолютно правильно))) Размер файла задаётся в байтах, а не в битах (это если деление на 8 задумано по этой причине)
Почему sizeof(BYTE*)??? Здесь логическая ошибка: при правильном чтении будет MessageBox (NULL, "Файл скопирован в буфер не полностью!","Info",... Это сообщение отредактировал(а) feodorv - 14.4.2012, 14:18 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Shmell |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
Решил поэкспериментировать с данной темой. Написал тоже, только для консольного приложения. Вот оно:
Добавлено через 2 минуты и 59 секунд Выдает сообщение об ошибке в строке № 65: Cannot convert 'unsigned char *' to 'unsigned char'. Type mismatch in parameter 'val' (wanted 'unsigned char', got 'unsigned char *') Казалось бы, при чем тут char? Добавлено через 6 минут и 39 секунд
count - это сколько байт необходимо считать. Мммм... Тут я запутался.... А ведь может быть нецелое количество байт в файле? Тогда как быть с остатком? Файл .txt. Да, в принципе, любой файл. Но в моем случае - файлы, связанные с текстом. Но не специфические изображения - pdf, djvu! Добавлено через 7 минут и 2 секунды Считать надо весь файл. Добавлено через 9 минут Но ведь я хочу байты считать. В массив. А потом уже каждый элемент массива конвертировать в двоичное представление. Что не так-то? Или я словосочетание "байт файла" воспринимаю буквально? Добавлено через 13 минут и 43 секунды Что же делать? |
||||
|
|||||
| feodorv |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
По-шагам:
"r" надо заменить на "rb" всё таки))) Если файл не удалось открыть, то SecretFile так и останется нуллом, а выполнение программы продолжится.... Будет "Программа выполнила недопустимую операцию..." Ну хотя бы return из main'а можно сделать при неудаче?
FILE_SIZE - это размер файла в байтах (да, нецелых байтов быть не может), поэтому и буфер нужен такого же размера:
Но поскольку sizeof(BYTE) всегда 1, то можно просто:
Кроме того, если уж произошёл такой крутой вираж в сторону C++, то malloc стоит заменить соответствующим new. То же самое: если нужен весь файл, то делить на 8 не нужно!!!! (Третий раз про это я писать не буду)))) В подпрограмму ByteToBinary Вы отправляете указатель textbuf (то есть адрес на весь массив байт), а нужно лишь значение i-того байта:
Вы заказали память. Освобождать её где-нибудь собираетесь? Вообще, при фиксированном и небольшом размере (в нашем случае - 8) заказ памяти можно заменить на стековую переменную:
Более того, как правильно заметил bsa, достаточно научиться битовым операциям и ненужны никакие дополнительные массивы)))) Это сообщение отредактировал(а) feodorv - 14.4.2012, 15:22 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||||||
|
|||||||||||||
| Shmell |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
FILE_SIZE объявлен как unsigned int. А буфер - это массив, по байту в каждом элементе. Что не так? Черт, сам не могу понять.... Добавлено через 1 минуту и 23 секунды Т.е. делить не надо вообще ни на что? Добавлено через 5 минут и 34 секунды Вот это здорово! Как я сам не догадался. |
|||
|
||||
| KaZepKa |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
А вообще не проще будет открыть файловый поток (объект класса fstream)?
С++ всё таки ) Это сообщение отредактировал(а) KaZepKa - 14.4.2012, 15:40 |
|||
|
||||
| Shmell |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
Где про них можно почитать??? feodorv, Вы меня, пожалуйста извините, я просто уже почти неделю бодаюсь с задачей стенографического внедрения левого файла в картинку в формате TIFF. И вот из одной проблемы в другую меня кидает)) The BrainRush will never stopped!!! Добавлено через 2 минуты и 50 секунд
Сам не знаю, почему так сделал... В Visual Studio так работал с файлом. А здесь, месяц спустя начал тупить с fopen. |
||||
|
|||||
| Shmell |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 14.2.2012 Репутация: нет Всего: нет |
Была страница в интернете, где про fstream все было расписано, теперь не могу найти
|
|||
|
||||
| KaZepKa |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
http://www.cplusplus.com/reference/iostream/fstream/ |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |