【发布时间】:2019-08-13 17:38:16
【问题描述】:
我正在尝试使用带有 C++ 的 libcurl 将单个图像文件下载到我的 Ubuntu 机器上。
我尝试复制并粘贴此问题中显示的简单示例:Download file using libcurl in C/C++
#include <stdio.h>
#include <curl/curl.h>
#include <string>
using namespace std;
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;
const char *url = "https://i.imgur.com/mWj0yzI.jpg";
char outfilename[FILENAME_MAX] = "/home/my_username/test.jpg";
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;
}
我希望它下载图像文件并将其保存为“test.jpg”在我的机器上。但是,当我运行这个程序时,“test.jpg”的大小是 0 字节。显然图像由于某种原因没有写入文件。
我做错了什么?
【问题讨论】:
-
你需要对
res做一些事情——目前你不知道你的代码为什么会失败,使用 curl_easy_perform 的返回值开始诊断。如果 curl init 失败也一样 - 您不会打印任何诊断信息。 -
你确定
fopen成功了吗?更仔细地研究libcurl(和fwrite)的文档并阅读How to debug small programs。考虑使用fflush -
感谢您的建议,我在存储
res之后添加了行cout << curl_easy_strerror(res) << endl;,它说No error。但是,我不确定应该如何诊断 init。 -
我在清理步骤之前添加了
fflush(fp);,行为没有改变。 -
考虑使用调试器逐行单步执行您的代码。另见:stackoverflow.com/q/25385173/5910058
标签: c++ ubuntu download libcurl