0

C++を学ぼうとしているだけです。私はスクレーパーから始めています。アイデアは、私がたくさんのページをこすり取り、正規表現を適用し、そして私の発見をファイルに書きたいということです。

しかし、私は現在、文字列変数に書き込むためにカールハンドルを割り当てようとして立ち往生しています。ポインタ(つまり、ヒント...)はありますか?

#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*'

私の見方では、CURLにメモリ内のストリームの場所を取得して、そこに書き込むことができるようにします。だから私は&文字を使ってそれを渡す必要があると思いました。しかしそれはうまくいかないようです。

4

2 に答える 2

3

最初の警告は

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

ここで、リテラルはです。したがって、ポインタは。constへのポインタである必要がありますconst char

2番目の問題はconst ostringstream stream。ストリームがの場合、const読み取りや書き込みなど、ストリームの状態を変更することはできません。

于 2012-05-13T03:39:29.253 に答える
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();

また、この回答が役立つ場合があります。ポインターCURLOPT_WRITEFUNCTIONを使用するコールバック関数を指定せずstd::ostringstreamに、libcurlがアクセスしようとすると、アクセス違反が発生writeします。

于 2012-05-13T03:49:37.117 に答える