2012-05-13 13 views
0

C++を習得しようとしています。私はスクレーパーで始めます。アイデアは、たくさんのページを一掃し、正規表現を適用し、結果をファイルに書きたいと思っています。C++:libcurlとストリームを使用する

しかし、私は現在、文字列変数に書き込むためにカールハンドルを割り当てようとしています。すべてのポインタ(ヒント私は意味...)?私は取得しています

#include <stdio.h> 
#include <curl/curl.h> 
#include <string> 
#include <iomanip> 
#include <boost/lexical_cast.hpp> 

// Typedefs 
using std::string;  using boost::lexical_cast; 
using std::cout; 
using std::endl; 
using std::ostringstream; 

// CURL directives 
static const string BASE_URL = "http://www.XXXXXX.com/action?page="; 
static char* USER_AGENT_STRING = "C++ Scraper"; 

// CURL variables 
static CURL* curl; 
static CURLcode res; 

     void setPageOpts(CURL* c, int count, const ostringstream stream) { 
      cout << "Got to the set opts method." << endl; 

      // Set URL 
      string new_url = BASE_URL + lexical_cast<string>(count); 
      curl_easy_setopt(curl, CURLOPT_URL, new_url.c_str()); 
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream); 
     } 

     void setConstOpts(CURL *c) { 
      // User agent string 
      curl_easy_setopt(curl, CURLOPT_USERAGENT, USER_AGENT_STRING); 
      //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); 
     } 

     void loadCurl() { 
      int status = curl_global_init(CURL_GLOBAL_ALL); 

      if (status != 0) { 
       cout << "An error has occurred with exit status " << status << endl; 
       exit(status); 
      } 
     } 

     int main() { 
      loadCurl(); 
      curl = curl_easy_init(); 

      if(curl) { 
       setConstOpts(curl); 

       for (int i = 1; i < 2; ++i) {   
        const ostringstream stream; 

        setPageOpts(curl, i, &stream); 

        res = curl_easy_perform(curl); 

        string output = stream.get(); 
        cout << "And the data was: " << endl << endl << output << endl; 
       } 

       curl_easy_cleanup(curl); 
      } 

      // Everything went as planned 
      return 0; 
     } 

現在のエラーは:

learn.cpp:15: warning: deprecated conversion from string constant to 'char*' 
learn.cpp: In function 'int main()': 
learn.cpp:62: error: conversion from 'const std::ostringstream*' to non-scalar type 'std::ostringstream' requested 
learn.cpp:67: error: request for member 'get' in 'stream', which is of non-class type 'const std::ostringstream*' 

私はそれを見る方法、私はそれがそこに書くことができるように、メモリ内のストリームの位置をカール取得したいです。だから私は&の文字を使い、それを手に入れる必要があると仮定しましたが、それはうまくいかないようです。あなたはconst charへのポインタでなければならないポインタので

答えて

2

あなたの定義:

void setPageOpts(CURL* c, int count, const ostringstream stream) 

はあなたの問題を引き起こす可能性があります。それはあなたがそれを更新することができるように参照することによりstreamを渡すために意味のようになります。

void setPageOpts(CURL* c, int count, ostringstream& stream) 

(とあなたがそれを渡すときcを使用することを忘れないでください)。

これに代えて

そして:

   const ostringstream stream; 
       setPageOpts(curl, i, &stream); 

は、あなたの関数を呼び出します。

 ostringstream stream; 
     setPageOpts(curl, i, stream); 

これはstreamを更新することができるようになります。

std::ostringstreamは、::get()がありません。私はあなたが意味を考える:

 string output = stream.str(); 

あなたはまた、libcurlのがそれにwriteしようとしたとき、あなたはアクセス違反を得るでしょう、あなたのstd::ostringstreamポインタを使用するコールバック関数を指定するCURLOPT_WRITEFUNCTIONを設定せず、this answer便利かもしれません。

3

最初の警告は、リテラルはconstある

static char* USER_AGENT_STRING = "C++ Scraper"; 

ためです。

2番目の問題はconst ostringstream streamです。ストリームがconstの場合、その状態を変更するものは何も実行できません(読み書きなど)。

関連する問題