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

Поиск:

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


Бывалый
*


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

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



стоит XP prof

кстати или я чего-то недопер, но

while (dwBytesRead==4096)

прога прочитает первые 4096 и на этом чтение прекращается

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


Практик
**


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

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



Протестировал с файлом около 700 Кило smile
Все работает, но жуть как долго открывается файл. Лучше уж целиком читать.

Тут видимо ошибка в том что не учитывался дополнительный нулевой байт который дописываем в буфер, т.е. не sizeof(cBuff), a sizeof(cBuff-1)


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


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



PM MAIL ICQ   Вверх
Tror
Дата 28.11.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Опытный
**


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

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



Всё зделал как рекомендовал Tror о открытии фала в RichEdit (в темке о сохранении фолйа из RichEdit) Но возник вопрос. программа компилится без ошибок и выполняется также. Но всё равно из файла не достается данные и не выводятся в сам RichEdit.

Привожу код 

Код

HANDLE            hFile; 
                    DWORD            dwFileSize;     
                    DWORD            dwBytesRead;  
                    LPVOID            lpvBuff;   
                    char            *cBuff; 
                    char            szTmpBuff[100];  
                    
                    SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"");
                    
                    //
                    //Вызов стандартного диалога открытия файла 
                    //
                    GetOpenFileName((tagOFNA *)"data.txt"); 
                    
                    //
                    //Попытка открытия файла  
                    //
                    hFile = CreateFile("data.txt",GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, 
                        (LPSECURITY_ATTRIBUTES) NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); 
                    //
                    //Если файл удалось открыть...
                    //
                    if (hFile)
                    {
                        //
                        //Определение размера файла
                        //
                        dwFileSize = GetFileSize(hFile, NULL);
                        if (dwFileSize == INVALID_FILE_SIZE)
                        {
                            MessageBox(NULL, "Cant get file size", "Error", MB_OK | MB_ICONSTOP);
                            return FALSE;
                        }
                        
                        //
                        //Выделение памяти для буфера
                        //
                        lpvBuff = VirtualAlloc(NULL, (SIZE_T)dwFileSize, MEM_COMMIT, PAGE_READWRITE);
                        if (lpvBuff == NULL)
                        {
                            MessageBox(NULL, "Cant allocate enough memory for file opening", "Error", MB_OK | MB_ICONSTOP);
                            return FALSE;
                        }
                        
                        cBuff = (LPTSTR)lpvBuff;
                                                                        
                        //
                        //Чтение из файла
                        //
                        SetFilePointer(hFile, 0, 0, FILE_BEGIN);
                        ReadFile(hFile, cBuff,  dwFileSize, &dwBytesRead, NULL); 
                        *(cBuff + dwBytesRead) = 0;
                        SendMessage(hwnd, (UINT)EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)cBuff);
                        
                        //
                        //Освобождение памяти
                        //
                        VirtualFree(lpvBuff, dwFileSize, MEM_RELEASE); 
                        
                        //
                        //Установка каретки в начало текста и флага модификации
                        //
                        SendMessage(hwnd, (UINT)EM_SETSEL, (WPARAM)0, (LPARAM)0);
                        SendMessage(hwnd, EM_SETMODIFY, FALSE, 0);  
                        
                        //
                        //Закрытие файла
                        //
                        CloseHandle(hFile);
                    }
                    else
                    {
                        //
                        //Вывод сообщения, если открытие файла невозможно
                        //
                        
                        MessageBox(NULL, "Can't open file", "ERROR", MB_OK); 
                        return FALSE;
                    }


Что сюда надо добавить чтобы содержимое отображалось в RichEdit

В окне находится Edit две кнопки и RichEdit
последний задается как 
Код

wdRichEdit = CreateWindow("RICHEDIT", "", ES_LEFT|ES_NOHIDESEL|ES_MULTILINE|ES_AUTOVSCROLL|ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER,
        20,50,100,200, hwnd, (HMENU)10001, hInstance, NULL);



Это сообщение отредактировал(а) Akeem - 17.9.2006, 21:19


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
rsm
Дата 17.9.2006, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akeem, вместо простой вставки текста лучше используй потоки. Кусок рабочего кода из моей программы:
Код

DWORD __stdcall ReadStreamProc(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
    return ReadFile((HANDLE) dwCookie, pbBuff, cb, pcb, 0) ^ 1;
}

void ReadFileToRichWnd(PCTSTR lpFileName, HWND hRichWnd)
{
    HANDLE hFile;
    EDITSTREAM esNotes;
    
    hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        esNotes.dwCookie = (DWORD) hFile;
        esNotes.pfnCallback = &ReadStreamProc;
        SendMessage(hRichWnd, EM_STREAMIN, SF_TEXT, (LPARAM) &esNotes);
        SendMessage(hRichWnd, EM_SETMODIFY, FALSE, 0);
        CloseHandle(hFile);
    }
}

PM MAIL   Вверх
Akeem
Дата 18.9.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rsm, 
Так смысл в том чтобы вставка текста производилась по нажатию на кнопку. которая тоже находится в окне. 


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
rsm
Дата 18.9.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akeem, и чем это меняет дело - допиши нужный код и все. Я тебе просто привел пример, как загрузить текст из файла в RichEdit без всяких там выделений памяти и пр.

Это сообщение отредактировал(а) rsm - 18.9.2006, 17:01
PM MAIL   Вверх
Akeem
Дата 18.9.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rsm, 
тогда обьясни работу кода,  а то мой компилер сильно ругается.

Я допишу эти две функции. 

после компиляции выдает ошибку: 
Код

[C++ Warning] rununit.cpp(65): W8004 'hCurs2' is assigned a value that is never used
  [C++ Warning] rununit.cpp(65): W8004 'wdSaveButton' is assigned a value that is never used
  [C++ Warning] rununit.cpp(65): W8004 'wdLoadButton' is assigned a value that is never used
  [C++ Warning] rununit.cpp(65): W8004 'wdEditBox' is assigned a value that is never used
  [C++ Warning] rununit.cpp(65): W8004 'wdRichEdit' is assigned a value that is never used
  [C++ Error] rununit.cpp(69): E2034 Cannot convert 'unsigned long' to 'unsigned long *'
  [C++ Error] rununit.cpp(69): E2342 Type mismatch in parameter 'lpNumberOfBytesRead' (wanted 'unsigned long *', got 'unsigned long')
  [C++ Error] rununit.cpp(84): E2034 Cannot convert 'unsigned long (__stdcall *)(unsigned long,unsigned char *,unsigned long,long *)' to 'unsigned long (__stdcall *)(unsigned long,unsigned char *,long,long *)'
  [C++ Error] rununit.cpp(226): E2034 Cannot convert 'int' to 'void *'
  [C++ Error] rununit.cpp(226): E2342 Type mismatch in parameter 'hRichWnd' (wanted 'void *', got 'int')
  [C++ Warning] rununit.cpp(228): W8004 'cBuff' is assigned a value that is never used



Это сообщение отредактировал(а) Akeem - 18.9.2006, 17:20


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
Akeem
Дата 18.9.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rsm, что означает строка
Код

esNotes.pfnCallback = &ReadStreamProc;



ошибки при компиляции

Код

 [C++ Error] rununit.cpp(85): E2034 Cannot convert 'unsigned long (__stdcall *)(unsigned long,unsigned char *,unsigned long,unsigned long *)' to 'unsigned long (__stdcall *)(unsigned long,unsigned char *,long,long *)'
  [C++ Error] rununit.cpp(226): E2034 Cannot convert 'long' to 'unsigned long *'
  [C++ Error] rununit.cpp(226): E2342 Type mismatch in parameter 'pcb' (wanted 'unsigned long *', got 'long')



Это сообщение отредактировал(а) Akeem - 18.9.2006, 17:32


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
rsm
Дата 18.9.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Для С++ чтоб не было проблем придется такое вот чудовищное извращение забацать:
Код

DWORD __stdcall ReadStreamProc(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb)
{
    return ReadFile(reinterpret_cast<HANDLE>(dwCookie), pbBuff, cb, reinterpret_cast<PDWORD>(pcb), 0) ^ 1;
}

void ReadFileToRichWnd(PCTSTR lpFileName, HWND hRichWnd)
{
    HANDLE hFile;
    EDITSTREAM esNotes;
    
    hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        esNotes.dwCookie = reinterpret_cast<DWORD>(hFile);
        esNotes.pfnCallback = reinterpret_cast<EDITSTREAMCALLBACK>(&ReadStreamProc);
        SendMessage(hRichWnd, EM_STREAMIN, SF_TEXT, reinterpret_cast<LPARAM>(&esNotes));
        SendMessage(hRichWnd, EM_SETMODIFY, FALSE, 0);
        CloseHandle(hFile);
    }
}


Цитата(Akeem @  18.9.2006,  19:30 Найти цитируемый пост)
что означает строка

Члену pfnCallback структуры EDITSTREAM передается адрес функции ReadStreamProc.
PM MAIL   Вверх
Akeem
Дата 18.9.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rsm, 
Всё таже проблема осталась! Всё класно компилится, но всё равно не выводит в окно содерживое файла. 

П.С. Мда. это конечно изврат!


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
rsm
Дата 19.9.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Akeem @  19.9.2006,  00:08 Найти цитируемый пост)
Всё класно компилится

Тогда почему у меня все преспокойно работает? (см. аттач)

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  rich.zip 2,86 Kb
PM MAIL   Вверх
Akeem
Дата 19.9.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rsm, 
Скинь мне плиз на почту, а то почему -то я не могу ничего с форума скачать!


--------------------
Мир огромен и мы только муравьи в нём! (С) formicha

PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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