Не удалось загрузить файл с использованием libcurl c ++ - PullRequest
0 голосов
/ 02 июля 2018

Что-то не так с моим следующим кодом, нет ошибки, но не загружается файл.

int main(void) 
{
    CURL *curl = NULL;
    CURLcode res = CURLE_OK;
    FILE *fp;
    curl = curl_easy_init();
    if (curl)
    {
        std::string url = "https://curl.haxx.se/mail/lib-2014-03/0158.html";
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        char outfilename[FILENAME_MAX] = "C:\Installer-Release-64-bit.html";
        fp = fopen(outfilename, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

И функция записи данных выглядит следующим образом

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

1 Ответ

0 голосов
/ 02 июля 2018

Пара вопросов:

write_data:  stream should technically be a void*
             You can cast it to FILE* inside the function.

             Return value should be the number of bytes processed.
             You are returning the number of objects `nmemb`.
             Should be `nmemb * size`

             Note: If the return value here is not `nmemb * size` curl
             will stop reading from the socket (I think, you need to check that).

fwrite:      Does not have to write out all `nmemb` you need to check
             and retry if the amount written is less than `nmemb`.

CURLOPT_URL  Two calls to set this option.
             curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
             curl_easy_setopt(curl, CURLOPT_URL, url);  // This is invalid
                                                        // url is not char*

Backslash    "C:\Installer-Release-64-bit.html"
             The backslash is an escape character. '\I' is simply 'I'
             Thus there is no slash at the beginning here.
             You can fix this with `\\` or you can use '/' as MS API
             has accepted this as a path separator for over a decade.

main()       Current declaration is not valid.
             In C++ the valid declarations of main are:
                  int main()
                  int main(int argc, char* argv[]) 

Вы должны проверить код ошибки во всех вызовах функций CURL и всех системных функциях. Вы говорите, что ошибки нет, но я не вижу каких-либо проверок, чтобы действительно это подтвердить.

...