使用缓冲区中的curl复制文件下载数据

时间:2015-09-24 12:33:38

标签: curl buffer memcpy

我正在编写下面的简单程序来下载url中提到的数据。  我想将数据复制到缓冲区中,并且不想使用for循环  现在正在发生。

#include <iostream>
#include <string.h>
#include <curl/curl.h> 
#include <queue>

using namespace std;
string data; //will hold the url's contents
char *bufnew;

size_t writeCallback(char* buf, size_t size, size_t nmemb, void*    up)
{ 
   printf("size  = %d\n\n\n",size);
   printf("size nmemb  = %d\n\n\n\n\n",nmemb);
   //memcpy(bufnew,buf,nmemb);
   for (int c = 0; c<size*nmemb; c++)
   {
       data.push_back(buf[c]);
   }
   return size*nmemb; //tell curl how many bytes we handled
}

int main()
{
   CURL* curl; //our curl object
   char url_firstpart[80];// = NULL;
   curl_global_init(CURL_GLOBAL_ALL); //pretty obvious
   curl = curl_easy_init();

   strcpy(url_firstpart,"http://www-itec.uni-   klu.ac.at/ftp/datasets/mmsys12/Valkaama/valkaama_1s");
   strcat(url_firstpart,"valkaama_1s_50kbit/valkaama_1s1.m4s");

   curl_easy_setopt(curl, CURLOPT_URL,url_firstpart);
   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
   curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 
   curl_easy_perform(curl);
   curl_easy_cleanup(curl);
   curl_global_cleanup();
   return 0;
}

在write_callback函数中,所有下载的数据都是buf,它被复制到for循环的数据中。我想避免这种循环并将整个数据复制到其他缓冲区中。我该怎么办呢。如果我正在做memcpy它给我分段错误。

此外,如果多次调用write_callback函数,我如何在第一次迭代时将缓冲区从第二次迭代附加到缓冲区,依此类推。 请指导我。

1 个答案:

答案 0 :(得分:0)

如果您想将缓冲区附加到std::string,可以像这样使用append

size_t writeCallback(char* buf, size_t size, size_t nmemb, void*    up)
{ 
   data.append(buf, size*nmemb);
   return size*nmemb; //tell curl how many bytes we handled
}

为了使用不同的缓冲区,您可以使用void *up代替全局变量data

要使用memcpy,您应该在复制之前分配bufnew