Je souhaite stocker le résultat de cette fonction curl dans une variable, comment puis-je le faire?
#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;
}
merci, je l'ai résolu comme ceci:
#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'est pas utiliséRéponses:
Vous pouvez définir une fonction de rappel pour recevoir des blocs de données entrants en utilisant
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, myfunc);
Le rappel prendra un argument défini par l'utilisateur que vous pouvez définir en utilisant
curl_easy_setopt(curl, CURLOPT_WRITEDATA, p)
Voici un extrait de code qui passe un tampon
struct string {*ptr; len}
à la fonction de rappel et augmente ce tampon à chaque appel à l'aide de realloc ().la source
size_t
(à partlen
lui-même) était déclaréconst
.std::string
allez iciLa réponse suivante est la façon C ++ de le faire, avec
std::string
, au lieu d'une chaîne terminée par un caractère nul. Il utilise toujours une fonction de rappel (il n'y a aucun moyen de contourner cela), mais gère également les erreurs d'allocation en utilisant try / catch.la source
s->append((char*)contents. nmemb);
fonctionne parfaitement avec moi et est plus concis. En outre, la signature de fonction officielle pour le rappel a unchar*
comme premier argument, vous pouvez donc l'utiliser et omettre le casting. Et enfin,s->resize()
initialise réellement l'espace nouvellement alloué. Comme vous êtes sur le point de l'écraser de toute façon, ces->reserve()
serait plus efficace.En lisant le manuel ici: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html Je pense que vous avez besoin de plusieurs appels à CURL_SETOPT, le premier étant l'URL que vous souhaitez traiter, le second étant quelque chose comme:
Où function_ptr correspond à cette signature:
Ce qui se passe ici, c'est que vous dénotez une fonction de rappel que libcurl appellera quand elle aura une sortie à écrire à partir du transfert que vous avez appelé. Vous pouvez lui faire écrire automatiquement dans un fichier ou lui passer un pointeur vers une fonction qui gérera la sortie elle-même. En utilisant cette fonction, vous devriez être capable d'assembler les différentes chaînes de sortie en un seul morceau, puis de les utiliser dans votre programme.
Je ne suis pas sûr des autres options que vous pourriez avoir à définir / quoi d'autre affecte le comportement de votre application, alors jetez un œil à cette page.
la source
Voici une version C ++ de la réponse acceptée par alex-jasmin
la source