【问题标题】:Curl Write error when trying to write data read to a file尝试将读取的数据写入文件时出现 Curl Write 错误
【发布时间】:2013-09-23 23:56:31
【问题描述】:

我正在执行以下 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 调用读取而不进行额外复制的最佳方法是什么? 如果我通过使用 nmemb 字节对 char 数组进行 m​​alloc 处理来复制收到的缓冲区并将其附加到文件中,则此方法成功。

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

【问题讨论】:

    标签: c curl libcurl void-pointers arrays


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多