![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Пытаюсь прочитать файл richedit. Иногда всё в норме а иногда в конце
вылезают всякие кракозяблы. Читаю файл следующим образом
Может что неправильно делаю? --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Гость_Kris |
|
|||
|
Unregistered |
Попробуй вот так
|
|||
|
||||
| Гость_Kris |
|
|||
|
Unregistered |
Точнее вот так
|
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Вы меня, конечно, простите -- я не гуру С++.
Что делает строка
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Тут такая штука. RichEdit ожидает что блок данных заканчивается нулем.
В приведенном примере ReadFile(hFile, cBuff, sizeof(cBuff), &dwBytesRead, NULL); читаются данные в cBuff , но нет гарантии что первый байт после данных будет 0 Строка *(cBuff+dwBytesRead)=0; записывает 0 сразу после блока данных, что исключает появление кракозябр В примере тоже есть очистка ZeroMemory(cBuff, sizeof(cBuff)); но после первого считывания, а часто первое оно же и последнее единственное. В редких случаях когда это не так вызываем SendMessage (hEditWnd, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx); SendMessage(hEditWnd, EM_REPLACESEL, 0, (LPARAM) (TCHAR*) cBuff); Иначе в RichEdit'e появится только блок данных считанный последним -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Всем спасибо, побежал пробовать
|
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Всё получилось, огромное спасибо, но вылезла другая проблемка.
При открытии файлов более 200к вылетает Buffer overrun ???????? --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Tror
Как мне кажется sizeof(CBuff) делает не то что вы предполагаете... |
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Я предполагаю, что sizeof(CBuff) возвращает размер буфера, разве нет.
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
А откуда он взялся-то, этот cBuff? Его же надо выделить сначала, определиться с размером...
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
у меня он определён как
char cBuff[1000] может надо как-то по другому? --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Ну вот, буффер всего 1000 байт, а ты хочешь впихнуть туда 200 000 (!)
Нужно выделять память соответственно размеру файла
Это сообщение отредактировал(а) Aleksandor - 24.11.2005, 15:39 -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Ну зачем нам тогда нужен
length-=dwBytesRead; если мы выделяем буфер размер которого равен размеру файла |
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Ну а если предположим памяти не хватит, разве нельзя прочитать файл кусками
тем же cBuff[1000] в цикле? --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Надо попробовать
char cBuff[4096+1]; Не забудь еще байтик для нуля-терминатора Тут могут быть нюансы связанные с реализацией файлового менеджера Кстати какая операционка стоит?
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
стоит XP prof
кстати или я чего-то недопер, но while (dwBytesRead==4096) прога прочитает первые 4096 и на этом чтение прекращается --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Протестировал с файлом около 700 Кило
Все работает, но жуть как долго открывается файл. Лучше уж целиком читать. Тут видимо ошибка в том что не учитывался дополнительный нулевой байт который дописываем в буфер, т.е. не sizeof(cBuff), a sizeof(cBuff-1) -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
||||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Спасибо большое, очень интересная статья
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| Akeem |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
Всё зделал как рекомендовал Tror о открытии фала в RichEdit (в темке о сохранении фолйа из RichEdit) Но возник вопрос. программа компилится без ошибок и выполняется также. Но всё равно из файла не достается данные и не выводятся в сам RichEdit.
Привожу код
Что сюда надо добавить чтобы содержимое отображалось в RichEdit В окне находится Edit две кнопки и RichEdit последний задается как
Это сообщение отредактировал(а) Akeem - 17.9.2006, 21:19 -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
||||
|
|||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 4 Всего: 62 |
Akeem, вместо простой вставки текста лучше используй потоки. Кусок рабочего кода из моей программы:
|
|||
|
||||
| Akeem |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
rsm,
Так смысл в том чтобы вставка текста производилась по нажатию на кнопку. которая тоже находится в окне. -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 4 Всего: 62 |
Akeem, и чем это меняет дело - допиши нужный код и все. Я тебе просто привел пример, как загрузить текст из файла в RichEdit без всяких там выделений памяти и пр.
Это сообщение отредактировал(а) rsm - 18.9.2006, 17:01 |
|||
|
||||
| Akeem |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
rsm,
тогда обьясни работу кода, а то мой компилер сильно ругается. Я допишу эти две функции. после компиляции выдает ошибку:
Это сообщение отредактировал(а) Akeem - 18.9.2006, 17:20 -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
|||
|
||||
| Akeem |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
rsm, что означает строка
ошибки при компиляции
Это сообщение отредактировал(а) Akeem - 18.9.2006, 17:32 -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
||||
|
|||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 4 Всего: 62 |
Для С++ чтоб не было проблем придется такое вот чудовищное извращение забацать:
Члену pfnCallback структуры EDITSTREAM передается адрес функции ReadStreamProc. |
|||
|
||||
| Akeem |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
rsm,
Всё таже проблема осталась! Всё класно компилится, но всё равно не выводит в окно содерживое файла. П.С. Мда. это конечно изврат! -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
|||
|
||||
| rsm |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 999 Регистрация: 16.3.2005 Репутация: 4 Всего: 62 |
Тогда почему у меня все преспокойно работает? (см. аттач) Присоединённый файл ( Кол-во скачиваний: 6 )
rich.zip 2,86 Kb |
|||
|
||||
| Akeem |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 14.7.2006 Где: Киев/Украина Репутация: нет Всего: 3 |
rsm,
Скинь мне плиз на почту, а то почему -то я не могу ничего с форума скачать! -------------------- Мир огромен и мы только муравьи в нём! (С) formicha |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |