用curl下载文件的C程序

我正试图用C编写一个程序来下载一些文件。 源代码:

#include <stdio.h> #include <string.h> #include <curl/curl.h> #include <curl/easy.h> size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { size_t written; written = fwrite(ptr, size, nmemb, stream); return written; } int main(){ if(curl_global_init(CURL_GLOBAL_ALL)){ printf("curl error. Exiting.\n"); return 1; } char links[3][100] = { "http://download.freeroms.com/nes_roms/08/big_nose_the_caveman.zip", "http://download.freeroms.com/nes_roms/02/contra.zip", "http://download.freeroms.com/nes_roms/08/super_mario_bros._(usajapan).zip"}; int n = 0, k = 0; char *lastslash; char* name; CURL *handle = curl_easy_init(); CURLcode res; FILE *file; while(n<3){ lastslash = strrchr(links[n], '/'); name = lastslash ? lastslash + 1 : links[n]; printf("\nURL: %s\n", links[n]); printf("Filename: %s\n", name); curl_easy_setopt(handle, CURLOPT_URL, links[n]); curl_easy_setopt(handle, CURLOPT_WRITEDATA, file); curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_data); file = fopen(name, "wb"); res = curl_easy_perform(handle); fclose(file); n++; } curl_easy_cleanup(handle); return 0; } 

我可以编译它,但是当我运行它时,这是输出:

 URL: http://download.freeroms.com/nes_roms/08/big_nose_the_caveman.zip Filename: big_nose_the_caveman.zip Segmentation fault (core dumped) 

我的编译器设置:gcc dl.c -lcurl -o dl

我发现当它试图执行curl_easy_perform()时会出现这个问题,但是我不知道该怎么做。

Solutions Collecting From Web of "用curl下载文件的C程序"

您需要在设置回调数据之前打开文件。 FILE*是按值存储的,而不是参考文件。

  file = fopen(name, "wb"); curl_easy_setopt(handle, CURLOPT_WRITEDATA, file); 

试试这个编码。

 #include <stdio.h> #include <curl/curl.h> #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, "http://localhost/aaa.txt"); 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; }