Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение файла в richedit 
:(
    Опции темы
Tror
Дата 22.11.2005, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



Пытаюсь прочитать файл richedit. Иногда всё в норме а иногда в конце
вылезают всякие кракозяблы.
Читаю файл следующим образом
Код

SetFilePointer(hFile, 0, 0, FILE_BEGIN);
    do
    {
        ReadFile(hFile, cBuff,  sizeof(cBuff), &dwBytesRead, NULL);
        SendMessage(hEditWnd, (UINT)EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)cBuff);
        ZeroMemory(cBuff,  sizeof(cBuff));
    }
    while (dwBytesRead != 0);


Может что неправильно делаю?
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Гость_Kris
Дата 22.11.2005, 22:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Попробуй вот так

Код

SetFilePointer(hFile, 0, 0, FILE_BEGIN);
    do
    {
        ReadFile(hFile, cBuff,  sizeof(cBuff), &dwBytesRead, NULL);
 [b]*(cBuff+dwBytesRead)=0;[/b]
        SendMessage(hEditWnd, (UINT)EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)cBuff);
        ZeroMemory(cBuff,  sizeof(cBuff));
    }
    while (dwBytesRead != 0);


  Вверх
Гость_Kris
Дата 22.11.2005, 23:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Точнее вот так smile

Код

DWORD ndx;

SetFilePointer(hFile, 0, 0, FILE_BEGIN);
    do
    {
        ReadFile(hFile, cBuff,  sizeof(cBuff), &dwBytesRead, NULL);
 *(cBuff+dwBytesRead)=0;

    ndx = GetWindowTextLength (hEditWnd);
    SendMessage (hEditWnd, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
    SendMessage(hEditWnd, EM_REPLACESEL, 0, (LPARAM) (TCHAR*) szLine);

   }
    while (dwBytesRead != 0);


  Вверх
Tror
Дата 23.11.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



Вы меня, конечно, простите -- я не гуру С++.
Что делает строка
Цитата
*(cBuff+dwBytesRead)=0;

--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Aleksandor
Дата 23.11.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


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

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



Тут такая штука. RichEdit ожидает что блок данных заканчивается нулем.

В приведенном примере
ReadFile(hFile, cBuff, sizeof(cBuff), &dwBytesRead, NULL);
читаются данные в cBuff , но нет гарантии что первый байт после данных будет 0
Строка *(cBuff+dwBytesRead)=0; записывает 0 сразу после блока данных, что исключает появление кракозябр smile

В примере тоже есть очистка 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!!
PM MAIL   Вверх
Guest
Дата 23.11.2005, 14:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем спасибо, побежал пробовать
  Вверх
Tror
Дата 24.11.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



Всё получилось, огромное спасибо, но вылезла другая проблемка.
При открытии файлов более 200к вылетает Buffer overrun
???????? smile
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
En_t_end
Дата 24.11.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Tror
Как мне кажется sizeof(CBuff) делает не то что вы предполагаете...
PM MAIL ICQ Skype GTalk Jabber   Вверх
Tror
Дата 24.11.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



Я предполагаю, что sizeof(CBuff) возвращает размер буфера, разве нет.
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Aleksandor
Дата 24.11.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


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

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



А откуда он взялся-то, этот cBuff? Его же надо выделить сначала, определиться с размером...



--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Tror
Дата 24.11.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



у меня он определён как

char cBuff[1000]

может надо как-то по другому?
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Aleksandor
Дата 24.11.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


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

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



Ну вот, буффер всего 1000 байт, а ты хочешь впихнуть туда 200 000 (!)
Нужно выделять память соответственно размеру файла smile

Код

HANDLE hFile=CreateFile(szFileName, GENERIC_READ,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   if (hFile==INVALID_HANDLE_VALUE)  return FALSE;  
   
  DWORD length=GetFileSize(hFile,NULL);     // для файлов меньше 4 GB
 
  LPVOID lpvBase = VirtualAlloc(NULL,                 // system selects address
                         length,                                       //  TODO-  4K page guard!
                         MEM_RESERVE | MEM_COMMIT,          
                         PAGE_READWRITE);       
  if (lpvBase == NULL ) { CloseHandle(hFile); return FALSE; } 
  cBuff=(LPTSTR)lpvBase;  

//начало цикла
    do    {
        ReadFile(hFile,cBuff,length,&dwBytesRead,NULL);
        length-=dwBytesRead;     // на случай если не все прочитано за один проход

 // ..............делаем другие дела
}
//конец цикла

     CloseHandle(hFile);                      // очистка
     VirtualFree(lpvBase,0,MEM_RELEASE);  


Это сообщение отредактировал(а) Aleksandor - 24.11.2005, 15:39


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Guest
Дата 24.11.2005, 16:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну зачем нам тогда нужен

length-=dwBytesRead;

если мы выделяем буфер размер которого равен размеру файла smile
  Вверх
Tror
Дата 24.11.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

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



Ну а если предположим памяти не хватит, разве нельзя прочитать файл кусками
тем же cBuff[1000] в цикле?
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Aleksandor
Дата 24.11.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


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

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



Надо попробовать smile Но тогда уж лучше сделать буфер размером в сектор
char cBuff[4096+1]; Не забудь еще байтик для нуля-терминатора smile
Тут могут быть нюансы связанные с реализацией файлового менеджера smile
Кстати какая операционка стоит?
Код


do {

ReadFile(hFile,cBuff,4096,&dwBytesRead,NULL);
}
while (dwBytesRead==4096);




--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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