Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как реализовать буфер?

7.2K
05 июля 2008 года
polaroid
94 / / 05.07.2008
Столкнулся с проблемой. Мне нужно считать какую либо информацию (из файла, либо из сети). Но дело в том, что заведомо неизвестен размер читаемой информации. Вот допустим приведу код:
Код:
hInt = InternetOpen(...);
hConn = InternetConnect(...);
hReq = HttpOpenRequest(...);
HttpSendRequest(...);

char szBuf[1024];
for (;;) {
    bRead = InternetReadFile(..., szBuf, sizeof(szBuf), ...);
    if (!bRead) break;
    strcat(szPage, szBuf); // szPage - главный буфер, по нему и вопрос
}
... // тут парсим главный буфер


Вопрос - как реализовать выделение памяти для такого буфера (szPage)??? Язык C. Интересно было бы посмотреть также asm-решение данной проблемы
1.9K
05 июля 2008 года
max_dark
256 / / 11.11.2005
Код:
hInt = InternetOpen(...);
hConn = InternetConnect(...);
hReq = HttpOpenRequest(...);
HttpSendRequest(...);

char szBuf[1024];
char *szPage=NULL, *tmp = NULL;
long pageSize=1024;
for (;;) {
    bRead = InternetReadFile(..., szBuf, sizeof(szBuf), ...);
    if (!bRead) break;
    if (szPage == NULL) {
        szPage = (char*)malloc(pageSize);
        if (szPage == NULL)
            exit(EXIT_FAILURE);
        szPage[0]=0;
    }
    else {
        pageSize+=1024;
        tmp=realloc(szPage, pageSize);
        if (tmp == NULL)
            exit(EXIT_FAILURE);
        szPage=tmp;
    }
    strcat(szPage, szBuf); // szPage - главный буфер, по нему и вопрос
}
//....
free(szPage);
7.2K
06 июля 2008 года
polaroid
94 / / 05.07.2008
Огромное спасибо. Просто думал что можно организовать другим путем (не используя malloc() realloc()). Да, и нужно ли освобождать переменную tmp в твоем коде?
1.9K
06 июля 2008 года
max_dark
256 / / 11.11.2005
tmp освобождать не надо : она служит для проверки успешности перераспределения памяти
341
15 июля 2008 года
Der Meister
874 / / 21.12.2007
А ещё лучше (если дело касается Windows) - резервировать память, а затем выделять её при необходимости(обе операции осуществляются с помощью VirtualAllocEx()). Можа даже, например, выделять память по мере поступления новых данных, получая, при этом, неразрывный блок информации. Дж. Рихтер в одной из своих книг подробнейшим образом описывал приёмы работы с выделением памяти в Windows (самый клёвый пример на эту тему - SpreadSheet по типу MS Excel).
7.2K
17 июля 2008 года
polaroid
94 / / 05.07.2008
Спасибо конечно, но не могли бы вы подсказать в какой именно книге? (название)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог