Descargar archivo usando libcurl en C / C ++

Estoy construyendo una aplicación (en Windows usando Dev-C ++) y quiero que descargue un archivo. Estoy haciendo esto usando libcurl (ya he instalado el código fuente usando Packman). Encontré un ejemplo de trabajo ( http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in- c-using-libcurl / ) pero no cierra el archivo una vez que se completa la descarga. Me gustaría que alguien diera un ejemplo sobre cómo descargar un archivo, ya sea en c o c ++. ¡Gracias por adelantado!

El ejemplo que estás usando está mal. Consulte la página man para easy_setopt . En el ejemplo, write_data usa su propio ARCHIVO, * archivo de salida, y no el fp que se especificó en CURLOPT_WRITEDATA. Es por eso que cerrar fp causa problemas, ni siquiera se abre.

Esto es más o menos lo que debería ser (no hay libcurl disponible aquí para probar)

#include  #include  /* For older cURL versions you will also need #include  #include  */ #include  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; } 

Actualizado: según lo sugerido por @rsethc types.h easy.h ya no están presentes en las versiones actuales de cURL.

Solo para los interesados, puede evitar escribir una función personalizada pasando NULL como último parámetro (si no tiene la intención de realizar un procesamiento adicional de los datos devueltos).
En este caso, se usa la función interna predeterminada.

Detalles
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA

Ejemplo

 #include  #include  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; }