Baixar arquivo usando libcurl em C / C ++

Eu estou construindo uma aplicação (no windows usando Dev-C ++) e eu quero fazer o download de um arquivo. Eu estou fazendo isso usando libcurl (eu já instalei o código fonte usando o packman). Eu encontrei um exemplo de trabalho ( http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in- c-using-libcurl / ), mas não fecha o arquivo após a conclusão do download. Eu gostaria que alguém desse um exemplo de como baixar um arquivo, seja em c ou c ++. Desde já, obrigado!

O exemplo que você está usando está errado. Veja a man page para easy_setopt . No exemplo, write_data usa seu próprio FILE, * outfile e não o fp especificado em CURLOPT_WRITEDATA. É por isso que fechar o fp causa problemas – nem sequer é aberto.

Isto é mais ou menos como deve ser (sem libcurl disponível aqui para testar)

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

Atualizado: como sugerido por @rsethc types.h easy.h não estão mais presentes nas versões atuais do cURL.

Apenas para aqueles interessados ​​você pode evitar escrever function personalizada passando NULL como último parâmetro (se você não pretende fazer processamento extra de dados retornados).
Neste caso, a function interna padrão é usada.

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

Exemplo

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