C'est probablement une question stupide, mais comment puis-je réellement obtenir strong> les données du site renvoyées par Des idées? Merci. P> EDIT: strong>
C'est le code que j'utilise (j'accède à l'API en streaming Twitter, je le fais même correctement?) P> curl_easy_perform () code> dans une variable que je peux travailler. Quand il exécute, je viens de voir tout cela flash sur le terminal. J'utilise C, au fait.
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?track=http");
curl_easy_setopt(curl, CURLOPT_USERPWD, "JEggers2:password");
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
3 Réponses :
Pour obtenir les données dans la chaîne, vous devez configurer une fonction de rappel écriture: En outre, l'adresse de votre variable de chaîne pour recevoir les données: p> size_t callback_func(void *ptr, size_t size, size_t count, void *stream)
{
/* ptr - your string variable.
stream - data chuck you received */
printf("%.*s", size, (char*)stream);
}
Pourriez-vous me donner un exemple de la fonction de rappel s'il vous plaît? Merci
Je reçois: Main.c: 10: AVERTISSEMENT: Format Pas un argument littéral à chaîne et pas de format. Des idées?
Je suppose que vous avez besoin printf ("% s", (char *) flux); code>
Merci Dave, ça marche :) Si vous supprimez ce support d'ouverture supplémentaire de votre dernier exemple, je vais aller de l'avant cela comme la réponse!
NOOOOOOOOOOOOO Les données ont été transmises au rappel, ne sont pas terminées de zéro. Vous ne pouvez pas et ne doit pas faire des opérations de chaîne comme Printf% S sur cela comme ça. Voir cet exemple à la place curl.haxx.se/libcurl/c/getinmemory.htmlled/a >
Corrigé, merci Daniel! Juste pour l'exemple Sake à l'aide de Printf Code> Je me suis emporté.
L'autre réponse semble être incorrecte dans son utilisation de premier et dernier paramètres de J'ai fait une compilable complète Exemple: P> callback_func code> (voir DOCS ). Le morceau réel des données que vous avez reçues est dans le premier paramètre,
PTR code>, tandis que le pointeur que vous transmettez avec
curlopt_writetata code> est le dernier paramètre.
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
size_t dataSize=0;
size_t curlWriteFunction(void* ptr, size_t size/*always==1*/,
size_t nmemb, void* userdata)
{
char** stringToWrite=(char**)userdata;
const char* input=(const char*)ptr;
if(nmemb==0) return 0;
if(!*stringToWrite)
*stringToWrite=malloc(nmemb+1);
else
*stringToWrite=realloc(*stringToWrite, dataSize+nmemb+1);
memcpy(*stringToWrite+dataSize, input, nmemb);
dataSize+=nmemb;
(*stringToWrite)[dataSize]='\0';
return nmemb;
}
int main()
{
char* data=0;
CURL*const curl=curl_easy_init();
if(!curl)
{
fprintf(stderr, "Failed to init curl");
return 1;
}
curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.com");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlWriteFunction);
if(curl_easy_perform(curl)!=CURLE_OK)
{
fprintf(stderr, "Failed to get web page\n");
return 1;
}
curl_easy_cleanup(curl);
if(!data)
{
fprintf(stderr, "Got no data\n");
return 1;
}
printf("Page data:\n\n%s\n", data);
free(data);
}
Cela m'a beaucoup aidé, mais pour une raison quelconque quand je l'ai couru (en C ++), cette affaire n'a jamais été appelée: si (! * Stringtowrite) * stringtowrite = malloc (nmemb + 1)) code>. Je devais le forcer à entrer dans cette condition en utilisant
si (DataSize == 0) code> sur le premier tour. Avant de faire cela, il se verrait pour une raison quelconque si tentative de realloc avant que le Malloc avait été appelé la première fois.
La fonction WriditAtraStream a un pointeur vide appelé tampon ce pointeur contient toutes les données (code HTML et en-têtes) CURLOPT_WRIREDATA P> P>