сохранить результат выполнения curl в вектор <string>в c ++ - PullRequest
1 голос
/ 18 ноября 2010

как написано в моем заголовке, я хотел бы сохранить результаты выполнения curl в векторе ... может ли кто-нибудь1 дать мне пример кода?я был в состоянии сохранить его в структуре в с.но я хочу сохранить его в векторе, который тоже в с ++, и мне немного не по себе с с ++.

    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;
}

Ответы [ 3 ]

1 голос
/ 18 ноября 2010

Я не знаю 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 () фактически создает строковый объект, инициализированный указателем и длиной данных.

1 голос
/ 18 ноября 2010

Попробуйте cURLpp .Вот пример , который может быть полезен.

0 голосов
/ 18 ноября 2010

Вот то, что вы, вероятно, ищете:

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;
 }

Я вполне уверен, что вы не хотите писать в void *ptr, который вы передали библиотеке CURL.Кроме того, похоже, что вы перезаписываете последний символ адреса памяти с помощью '\0', а затем возвращаете исходное значение туда после нажатия на вектор.Я не уверен, что это будет работать так, как ожидалось.

...