我正在尝试使用带有以下代码的cURL库从我的服务器下载测试文件:
#define CURL_STATICLIB
#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string.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(void)
{
CURL *curl;
FILE *fp;
CURLcode res;
char *url = "http://pixhost.tk/test.txt";
char outfilename[FILENAME_MAX] = "/Users/Nathan/Desktop";
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);
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
并按照以下方式编译:
$ gcc main.c -lcurl -o curltest
但是当我执行它时,我收到了分段错误错误。我该怎么做才能纠正这个问题?
答案 0 :(得分:3)
我不熟悉cURL,但有两件事可能会对你有帮助,所以如果我说废话,请原谅我:
char *url = "http://pixhost.tk/test.txt";
是一个只读字符串,因此将其更改为const char *url = "http://pixhost.tk/test.txt";
这可能会在编译期间显示您的问题。fopen
的结果,也许它失败了,这解释了段错误,而且我似乎很可能因为你试图打开“/ Users / Nathan / Desktop”这应该是目录AFAIK。答案 1 :(得分:0)
自从我使用curl已经有一段时间了,我不确定这会导致段错误,我认为你应该这样调用fwrite:
fwrite(ptr, 1, nmemb * size, stream);
因为fwrite返回写入的元素数,而{{1>}不是(我不认为)保证是一个。而且由于你正在返回fwrite返回的内容,我相信你返回的字节数比你实际编写的少,因为函数应该返回它写的字节数。