0

我正在执行以下 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'ing 一个带有nmemb字节的 char 数组接收到的缓冲区的副本并将其附加到文件中,则此方法成功。

我还想知道是否有任何其他函数可以将格式化数据写入文件,我可以使用它来代替 fprintf。

4

1 回答 1

2

您在那里使用 fprintf() 是原因。您从 libcurl 传递给回调的缓冲区不是零终止的,因此您不能假设 %s 和 fprintf() 会做正确的事情 - 即使在许多情况下它可能是纯属偶然的。

请改用 fwrite() 或类似方法,并告诉它要输出的缓冲区大小!

于 2013-09-24T07:35:29.870 回答