Я хочу сохранить результат для символьной строки с помощью libcurl - PullRequest
2 голосов
/ 22 мая 2009

Я пишу программу с помощью libcurl.

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

#define URL_MAX 256

int main(int argc, char *args[])
{
    CURL *curl;
    CURLcode res;
        curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, args[1]);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    return 0;
}

$ gcc tinyCurl.c $ gcc curl-config --libs tinyCurl.c $ ./a.out http://example.com/ Я изучаю поиск в Google, но я не могу найти. Я хочу хранить char [], а не stdout.

Это вопрос новичка заранее благодарю

Ответы [ 2 ]

3 голосов
/ 22 мая 2009

Я понял!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

size_t  write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
  char buf[size*nmemb+1];
  char * pbuf = &buf[0];
  memset(buf, '\0', size*nmemb+1);
  size_t i = 0;
  for(;  i < nmemb ; i++){
    strncpy(pbuf,ptr,size);
    pbuf += size;
    ptr += size;
  }
  printf("%s",buf);
  return size * nmemb;
}

int main(int argc, char **argv)
{
    CURL *curl_handle;
    curl_handle = curl_easy_init();
    enum{Command,URL,NumCommands};
    if(NumCommands != argc){
        fprintf(stderr,"Usage : %s <url>\n",argv[0]);
        return 1;
    }
    curl_easy_setopt(curl_handle,   CURLOPT_URL, argv[URL]);
    curl_easy_setopt(curl_handle,   CURLOPT_NOPROGRESS  ,1);
    curl_easy_setopt(curl_handle,   CURLOPT_WRITEFUNCTION,&write_data);
    curl_easy_perform(curl_handle);
    curl_easy_cleanup(curl_handle);
    return 0;
}

Спасибо, Шестигранник.

3 голосов
/ 22 мая 2009

Проверьте функцию curl_easy_setopt().

Вы хотите зарегистрировать обратный вызов, используя CURLOPT_WRITEFUNCTION - этот обратный вызов будет вызываться при получении данных. Из обратного вызова вы можете делать с данными все, что захотите.

Примечание - это несколько сложная штука для начинающего. Вы должны понимать, что такое указатели на функции.

(этот ответ основан на чтении API в http://curl.haxx.se/libcurl/c/curl_easy_setopt.html - я никогда не использовал libcurl).

РЕДАКТИРОВАТЬ -
Вот пример, найденный поиском по номеру CURLOPT_WRITEFUNCTION в списке рассылки curl-library . Этот пример Даниэля Стенберга.

...