【问题标题】:save the output of a curl perform to a vector<string> in c++将 curl 执行的输出保存到 c++ 中的 vector<string>
【发布时间】:2010-11-18 12:39:21
【问题描述】:

正如我的标题所说,我想将 curl 执行的输出保存到向量中。 任何人都可以给我一个示例代码吗? 我能够将它保存到 c 中的结构中。但我想将它保存到一个向量中,这也是 c++ 中的,我对 c++ 有点不满意。

    vector<string> contents;

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
int numbytes = size*nmemb;
char lastchar = *((char *) ptr + numbytes - 1);
*((char *) ptr + numbytes - 1) = '\0';
contents.push_back((char *)ptr);
*((char *) ptr + numbytes - 1) = lastchar;  // Might not be necessary.
return size*nmemb;
}



int main(int argc, char *argv[])
{

vector<string>::iterator i;

CURL* curl = curl_easy_init();
if(curl)
    {
    curl_easy_setopt(curl,CURLOPT_URL, argv[1]);
    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle_data);
    CURLcode res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    if (res == 0){
        for(i=contents.begin();i!=contents.end();i++)
            cout << *i << endl;
    }else
        cerr << "Error: " << res << endl;
    }
return 0;
}

【问题讨论】:

  • 什么是“卷曲表演”?它是活生生的吗?我可以吃吗?或者它有签名吗?您为什么不向我们展示您拥有什么,以及您需要调用的 curl 函数的签名,以及您希望结果最终包含的数据结构?事实上,您的问题需要了解 C++ 和 curl。并且知道 curl 的 C++ 程序员比 C++ 程序员少得多。
  • @sbi,我真的不认为你想吃 curl。另一方面,我听说每年的这个时候 greps 都很好吃。
  • @sbi : :P .. 会给你我拥有的 sn-p .. 我认为它的工作.. 有一个将页面保存为字符串的代码。编辑它以保存到矢量中。
  • 你说的是curl_easy_perform吗?
  • 这段代码丑得要命,编译时遗漏了很多std::前缀,使用C风格的强制转换,长时间使用大括号和缩进可能会导致眼癌。不过,不知道 curl,我不知道它在算法上可能有什么问题,而且你也没有给出任何线索。

标签: c++ curl vector libcurl


【解决方案1】:

我不知道 curl,所以我假设设置代码是正确的。所以你想要的是一个回调函数,为接收到的每个数据块添加一个字符串到一个字符串向量。这也假设返回的数据是 8 位字符。

vector<string> contents;

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
    contents.push_back(string(static_cast<const char*>(ptr), size * nmemb));
    return size * nmemb;
}

对 string() 的“调用”实际上构造了一个用指针和数据长度初始化的字符串对象。

【讨论】:

    【解决方案2】:

    试试cURLpp。这是an example,可能有用。

    【讨论】:

      【解决方案3】:

      您可能正在寻找以下内容:

      size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream)
       {
           size_t numbytes = size*nmemb;
      
           string temp(static_cast<char*>(ptr), nmemb);
      
           contents.push_back(temp);
      
           return numbytes;
       }
      

      我很确定您不想写信给 CURL 库传递的 void *ptr。而且看起来您正在用'\0' 覆盖内存地址的最后一个字符,然后在推送到向量后将原始值放回那里。我不确定这是否会按预期工作。

      【讨论】:

      • @Ferruccio : 猜你是跑得更快的牛仔,所以我会为你 +1 :)
      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多