我正在执行以下curl调用以从我的网站读取数据:
curl_easy_setopt(handle, CURLOPT_URL, "http://mysite.com");
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_data);
CURLcode code = curl_easy_perform(handle);
这是我的回调方法,write_data:
size_t write_data(void *buffer, size_t len, size_t nmemb, void *userp) {
const char* _file = "file_path";
FILE* _dataFile = fopen(_file, "a+");
if (!_dataFile) {
logMsg("Failed to open file to write to it");
exit(EXIT_FAILURE);
}
int num = fprintf(_dataFile, "%s", (char *) buffer);
fclose(_dataFile);
return num;
}
我正在获取数据块和gdb'ing我意识到在最后一次调用中,我得到了12303字节,但是写了12310.在我看来,问题在于我正在编写内容文件的方式,通过将缓冲区转换为char。
所以,我的问题是什么是写入数据(到文件)的最佳方式,从Curl调用读取而不进行额外的复制?
如果我通过malloc使用nmemb
字节的char数组来接收缓冲区的副本并将其附加到文件,则此方法会成功。
我还想知道是否还有其他功能可以将格式化数据写入文件,我可以使用它来代替fprintf。
答案 0 :(得分:2)
你在这里使用fprintf()是有原因的。从libcurl传入回调的缓冲区是 not 零终止,所以你不能假设%s和fprintf()会做正确的事 - 即使在很多情况下它可能是纯粹的机会。
使用fwrite()或类似代码,告诉它要输出的缓冲区大小!