Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Выделение памяти


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

    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  Объясните пожалуйста в чем я не прав?

Автор: neosapient 26.11.2006, 22:36
Было 
ReadFile(hFile,&readfile,1000,&b,NULL);

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

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

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

Автор: Toohtik 29.11.2006, 00:44
Может вопрос и не сильно относится к теме, но все таки. Почему при чтении из файла в конце всегда добавляется 4 непонятны символа. Ну один я предпологаю - это конец строки, а 3 остальных?

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

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

Автор: Toohtik 29.11.2006, 10:50
Та это все понятно smile Но все равно интересно откуда берутся эти символы

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

Автор: Toohtik 29.11.2006, 14:13
Появилась такая мысль: а может это из за того что я выделяю память равную размеру файла, а не количеству букв в нем?

Автор: JackYF 29.11.2006, 18:30
Toohtik, а это что, не одно и то же?

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

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

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

Те добавочные символы, что видны - мусор в памяти

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


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)