尝试将读取的数据写入文件时发生卷曲写入错误

时间:2013-09-23 23:56:32

标签: c curl libcurl void-pointers arrays

我正在执行以下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。

1 个答案:

答案 0 :(得分:2)

你在这里使用fprintf()是有原因的。从libcurl传入回调的缓冲区是 not 零终止,所以你不能假设%s和fprintf()会做正确的事 - 即使在很多情况下它可能是纯粹的机会。

使用fwrite()或类似代码,告诉它要输出的缓冲区大小!