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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти 
:(
    Опции темы
Toohtik
Дата 26.11.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

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



Есть задача: прочитать и вывести на экран текст из файла. Это все у меня отлично получается. читаю таким образом:
Код

    static const int sizebuf=256;
    static int size;
    static    char buf[sizebuf];
    static char buf2[100];
    static DWORD b;
    static char readfile[1000];

        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);            
            TextOut(hdc,100,100,readfile,strlen(readfile));        
            EndPaint(hWnd, &ps);
        break;
        case WM_CREATE:

            hFile =    CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
            size=GetFileSize(hFile,NULL);
    
                wsprintf(buf2,"%s %d %s","Размер файла",size,"байт");
            CreateWindow("static", buf2, WS_CHILD|WS_VISIBLE,
                20, 50, 170, 16, hWnd, NULL, hInst, NULL);

            ReadFile(hFile,&readfile,1000,&b,NULL);

            break;
       

Но как всегда хочется большего - я хочу чтоб readfile[1000] был произвольной длины, т.е. размер определялся в ходе работы программы:
Код

readfile=(char*)malloc(size)

Но почему то при выводе текста выбивает ошибку smile  Объясните пожалуйста в чем я не прав?

Это сообщение отредактировал(а) Toohtik - 26.11.2006, 22:07

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Prog.cpp 5,86 Kb
PM ICQ   Вверх
neosapient
Дата 26.11.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Было 
ReadFile(hFile,&readfile,1000,&b,NULL);

Надо
ReadFile(hFile,readfile,1000,&b,NULL);

Тут в качестве второго параметра передавался адрес указателя, а надо сам указатель.

P.S.
Вместо TextOut используй DrawText

Это сообщение отредактировал(а) neosapient - 26.11.2006, 22:39
PM MAIL   Вверх
Toohtik
Дата 29.11.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

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



Может вопрос и не сильно относится к теме, но все таки. Почему при чтении из файла в конце всегда добавляется 4 непонятны символа. Ну один я предпологаю - это конец строки, а 3 остальных?
PM ICQ   Вверх
witex
Дата 29.11.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну замени просто четвёртый с конца символ на '\0'
Для точности конечно удобно сделать так:
Код

int a=strlen(readfile);
raedfile[a-4]='\0';

--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Toohtik
Дата 29.11.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

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



Та это все понятно smile Но все равно интересно откуда берутся эти символы
PM ICQ   Вверх
BUGOR
Дата 29.11.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 16



Toohtik, Это ты уже смотри в параметры передаваемые функции, скорее всего  ты записываешь больше байт, чем надо, ну т.е. сама ReadFile ничего лишнего в файл не пишет, никаких служебных символов и прочего, всё чётко: сколько сказал - столько записали.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Toohtik
Дата 29.11.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

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



Появилась такая мысль: а может это из за того что я выделяю память равную размеру файла, а не количеству букв в нем?
PM ICQ   Вверх
JackYF
Дата 29.11.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Toohtik, а это что, не одно и то же?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Toohtik
Дата 29.11.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

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



Ну как я подумал, может добавляется еще какая то информация не текстовго характера... Ну к примеру дата создания файла или еще что - то ... 
PM ICQ   Вверх
neosapient
Дата 29.11.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я думаю, что у тебя выделен массив, но он не инициализирован.
Когда ф-ия ReadFile пишет в буфер, она возвращает в четвертую переменную (b) число скопированых байт. 
Текстовая строка в буфере нулем не закрывается. Это нужно самому делать.
Код

ReadFile(hFile,&readfile,1000,&b,NULL);
readfile[b]='\0';

Те добавочные символы, что видны - мусор в памяти
PM MAIL   Вверх
JackYF
Дата 29.11.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Цитата(Toohtik @  29.11.2006,  21:04 Найти цитируемый пост)
Ну как я подумал, может добавляется еще какая то информация не текстовго характера... Ну к примеру дата создания файла или еще что - то ...  


Нет. Размер файла = количество символов в нем.

А насчет самой проблемы, судя по всему, 
neosapient прав.


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

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


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

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


 




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


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

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