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

Ваш аккаунт

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

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

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

данные изменяются в потоке

50K
10 ноября 2009 года
rainor
8 / / 19.08.2009
С вэб-сервера в буфер читается файл, затем буфер направляется в поток связанный с файлом. Довольно банальная ситуация, но почему то размер прочитанного и размер записанного отличаются в несколько раз. Но надо заметить, что если размер файла меньше буфера, то все нормально. Перегуглил много, но в чем проблема не нашел. Вот код
Код:
int cnct()
{
    HINTERNET hOpen;
    HINTERNET hSession;
    HINTERNET hRequest;
    LPWCH szAppName;
    GetModuleFileName(0, szAppName,16);

    hOpen=InternetOpen( szAppName,
                INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
                NULL, NULL, 0);
    if (hOpen != NULL) {
        wprintf(L"connection %i\n",hOpen);
        hSession=InternetConnect(hOpen, szlpServer, nServerPort, L"", L"", INTERNET_SERVICE_HTTP, 0, 0);

        if (hSession != NULL) {
            wprintf(L"session %i\n",hSession);
            hRequest=HttpOpenRequest(hSession, L"GET", szlpPath, HTTP_VERSION, L"", 0, INTERNET_FLAG_RELOAD, 0);
           
            if (hRequest != NULL) {
                wprintf(L"request %i\n",hRequest);
                BOOL bSend=HttpSendRequest(hRequest, NULL, 0, NULL, 0);

                if (bSend) {
                    wprintf(L"send (true) %i\n",bSend);
                    int nC=1;
                    ofstream sStream("C:\\test\\tst.bmp",ios::out|ios::binary);
                    if (sStream.is_open()) for(;;) {
                        char szData[1025];
                        DWORD dwBytesRead;
                        BOOL bRead=InternetReadFile(hRequest, &szData, sizeof(szData)-1, &dwBytesRead);

                        if (bRead == FALSE ||  dwBytesRead == 0) break;
                        szData[dwBytesRead] = 0;
                        sStream << szData;
                        if (nC<4||dwBytesRead<1024) printf("data (size %i, step %i):\n%s\n",dwBytesRead, nC, szData);
                        nC++;
                    }
                }
            }
            InternetCloseHandle(hRequest);
        }
        InternetCloseHandle(hSession);
    }
    InternetCloseHandle(hOpen);
    return 0;
}
12K
10 ноября 2009 года
Ghox
297 / / 26.07.2009
Может быть, для записи в файл вместо перегруженного оператора <<, как сейчас у вас:
 
Код:
sStream << szData;

использовать функцию write:
 
Код:
sStream.write(szData, dwBytesRead);

?
Насколько я знаю, при использовании оператора << при записи в файл char-овской строки символы строки записываются до тех пор, пока очередной символ не окажется символом конца строки '\0', и нет никаких гарантий, что в считываемом буфере символ конца строки окажется обязательно в конце буфера, а не где-нибудь в середине или в начале...

При использовании же write символы записываемого буфера пишутся в файл независимо от того, имеют ли какие-нибудь значение = '\0' или нет.
50K
10 ноября 2009 года
rainor
8 / / 19.08.2009
Спасибо огромное! Помогло. Действительно я не подумал, что в бинарном потоке могут встречаться символы 0
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог