在C / C ++中使用libcurl下载文件
我正在构build一个应用程序(在使用Dev-C ++的Windows上),我希望它下载一个文件。 我正在做这个使用libcurl(我已经安装了使用packman的源代码)。 我发现一个工作的例子( http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in- c-using-libcurl / ),但下载完成后不会closures文件。 我希望有人来举例说明如何下载文件,无论是在C或C + +。 提前致谢!
你使用的例子是错误的。 请参阅easy_setopt的手册页。 在这个例子中,write_data使用自己的FILE,* outfile,而不是在CURLOPT_WRITEDATA中指定的fp。 这就是为什么closuresFP导致问题 – 甚至没有打开。
这或多或less应该是这样的(没有可用的libcurl来testing)
#include <stdio.h> #include <curl/curl.h> /* For older cURL versions you will also need #include <curl/types.h> #include <curl/easy.h> */ #include <string> size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written = fwrite(ptr, size, nmemb, stream); return written; } int main(void) { CURL *curl; FILE *fp; CURLcode res; char *url = "http://localhost/aaa.txt"; char outfilename[FILENAME_MAX] = "C:\\bbb.txt"; curl = curl_easy_init(); if (curl) { 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; }
更新:按照@rsethc types.h
和easy.h
build议,不再存在于当前的cURL版本中。
对于那些感兴趣的人,可以通过传递NULL作为最后一个参数来避免写自定义函数(如果你不打算做返回数据的额外处理)。
在这种情况下使用默认的内部函数。
细节
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA
例
#include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; FILE *fp; CURLcode res; char *url = "http://stackoverflow.com"; char outfilename[FILENAME_MAX] = "page.html"; curl = curl_easy_init(); if (curl) { fp = fopen(outfilename,"wb"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); res = curl_easy_perform(curl); curl_easy_cleanup(curl); fclose(fp); } return 0; }