![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| klein |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
Добрый день.
Пишу програму на билдере. Ее суть заключается в том, чтобы она считывала побитно файл, заносила значения каждого бита в ячейку масива, потом второй масив неким алгоритмом присваивал значения первого (в даном случае просто buf2[b2]=buf1[b1]) а потом второй масив записывался в файл. Первоначально писал так, чтобы файл считывался в двумерный масив (какбы по строчкам с определенной длинной), но получалось так, что в файл записывало только 260 первых символов, тогда решил написать так, чтобы весь файл считывался в одномерный масив , а потом записывался в файл. Проблема повторилась. Файлы получаются по 304 байта и записывается только "верхний" кусок исходного файла. Это первая проблема, которую я не могу понять . Вторую проблему я понимаю, но не знаю как исправить. Она заключается в том, что с файла в масив считываются символы, а надо чтобы значения бит (0,1). В потокахуказывал ios::binary. Буферы типа бул работают не коректно(bool buf1[sizeof iuf],buf2[sizeof iuf]; ) . Подведу черту и конкретизирую вопросы: 1.) Почему пишется только "шапка" файла? 2.) Как считывать в масив значения битов? Делал поиск по форуму, что сильно помогло составить даный код :
На возникшие вопросы при поиске аналогию не нашол. Заранее благодарен! Модератор: Название темы должно отражать ее суть! Это сообщение отредактировал(а) Earnest - 26.3.2007, 10:49 |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
все просто: оператор sizeof вовсе не возвращает размер занимаемый файлом на диске, он возвращает место занимаемое переменной данного типа в оперативной памяти. не совсем понятно, скажу только, что минимальная адресуемая ячейка памяти - байт а не бит, а что вы в этот байт засунете (или извлечете) - дело ваше, личное. |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Сначала ознакомьтесь с битовыми операциями. Затем ознакомьтесь с операциями блочного чтения/ записи. Сразу обнаружите свои ошибки.
|
|||
|
||||
| klein |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
По существу второго вопроса понял ошибку. Минимальный квант считывания байт. Потом надо будет уже к нему применить битовую маску и проверить - установлен ли конкретный бит.
По существу первого вопроса сейчас разбираюсь как узнать размер файла на диске для выделения размера буфера. Мысль пока не закончена, но направления два: 1) пропустить через цикл , и заждую итерацию инкремировать счетчик байтов
2) с помощью указателя считывания seekg
Позже отпишусь. |
||||
|
|||||
| klein |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
Вот получился такой код:
Он работает, (просто копирует файл) но при больших файлах выдает ошибку . Мои предположения в том, что весь файл не в состоянии записаться в оперативную память(char *buf1 = new char[size+1]; ). Как розделить память буфера на "куски"? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Какую? Код у тебя довольно бессмысленный: 1) Какой смысл выделять память под целый файл, если ты копируешь посимвольно? 2) зачем тебе buf2? ты его не используешь, да еще и не уничтожаешь. 3) чтобы избежать проблем с большими файлами, читай-пиши блоками: определи размер файла file_size, выдели буфер разумной длины (buf_size) читай блок и сразу пиши:
Это сообщение отредактировал(а) Earnest - 26.3.2007, 15:49 -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |