InternetReadFile () портит загрузку в C - PullRequest
1 голос
/ 18 мая 2010

Я могу загружать текстовые документы (.html, .txt и т. Д.), Но не могу загружать изображения или исполняемые файлы. Я уверен, что это потому, что я использую char, и эти файлы являются двоичными. Я знаю, что в C # я бы использовал байт. Но какой тип данных я бы использовал в этом случае?

    char buffer[1];
    DWORD dwRead;
    FILE * pFile;
    pFile = fopen(file,"w");
    while (InternetReadFile(hRequest, buffer, 1, &dwRead))
    {
        if(dwRead != 1) break;
        fprintf(pFile,"%s",buffer);
    }
    fclose(pFile);

Ответы [ 2 ]

4 голосов
/ 18 мая 2010

Ваша проблема не в char, он использует fprintf с% s.char может содержать все байтовые значения.Когда в блоке двоичных данных есть символ \0 (NULL), fprintf прекратит вывод данных в это время.

Вы хотите использовать fwrite в этом случае.В Windows также важно использовать спецификатор b при открытии бинарных файлов.

2 голосов
/ 18 мая 2010

Поскольку вы читаете по одному байту за раз в буфер, который не заканчивается нулем (поскольку его размер равен 1), вам необходимо вывести один байт за раз, либо '%c' в качестве строки формата, либо используя putc(buffer[0], pFile). В существующем состоянии вы уязвимы для переполнения буфера (например, могут случиться плохие вещи!).

Если вы работаете на платформе Windows, было бы неплохо открыть файл в двоичном режиме; это не повредит Unix, поскольку нет разницы между двоичным и текстовым режимом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...