Desejo armazenar o resultado desta função curl em uma variável, como posso fazer isso?
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
obrigado, resolvi assim:
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
function_pt(void *ptr, size_t size, size_t nmemb, void *stream){
printf("%d", atoi(ptr));
}
int main(void)
{
CURL *curl;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_pt);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
system("pause");
return 0;
}
CURLcode res;
não é usadoRespostas:
Você pode definir uma função de retorno de chamada para receber blocos de dados de entrada usando
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, myfunc);
O retorno de chamada terá um argumento definido pelo usuário que você pode definir usando
curl_easy_setopt(curl, CURLOPT_WRITEDATA, p)
Aqui está um trecho de código que passa um buffer
struct string {*ptr; len}
para a função de retorno de chamada e aumenta esse buffer em cada chamada usando realloc ().fonte
size_t
(além delen
si mesmo) fossem declaradosconst
.std::string
vá aquiA seguinte resposta é a maneira C ++ de fazer isso, com
std::string
, em vez de uma string terminada em nulo. Ele ainda usa uma função de retorno de chamada (não há como contornar isso), mas também lida com erros de alocação usando try / catch.fonte
s->append((char*)contents. nmemb);
funciona perfeitamente comigo e é mais conciso. Além disso, a assinatura da função oficial para o retorno de chamada tem umchar*
primeiro argumento, portanto, você pode usá-lo e omitir a conversão. E, por último,s->resize()
inicializa de fato o espaço recém-alocado. Como você está prestes a sobrescrevê-lo de qualquer maneira,s->reserve()
seria mais eficiente.Lendo o manual aqui: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html Acho que você precisa de várias chamadas para CURL_SETOPT, a primeira sendo o URL que deseja processar, a segunda sendo algo como:
Onde function_ptr corresponde a esta assinatura:
O que acontece aqui é que você denota uma função de retorno de chamada que libcurl chamará quando tiver alguma saída para escrever de qualquer transferência que você tenha invocado. Você pode fazer com que ele grave automaticamente em um arquivo ou passe um ponteiro para uma função que tratará a própria saída. Usando esta função, você deve ser capaz de montar as várias strings de saída em uma peça e depois usá-las em seu programa.
Não tenho certeza de quais outras opções você pode ter para definir / o que mais afeta como você deseja que seu aplicativo se comporte, então dê uma boa olhada nessa página.
fonte
Aqui está um sabor C ++ da resposta aceita de alex-jasmin
fonte