2011-11-05 4 views
6

En l'absence de curlpp pour le fonctionnement en C++, j'ai décidé de commencer à utiliser libcurl avec C à la place (pour l'instant). Étant complètement nouveau à la fois C et C++, cela devient un peu confus. Je ne suis même pas sûr de pouvoir séparer les fonctions C et C++, mais pour autant que je sache, il s'agit de C.Sortie libcurl vers la variable au lieu du fichier texte

Avec l'aide d'un ami, j'ai réussi à écrire la sortie (contenu de la page curl ramassé) à un fichier texte, mais je veux le mettre dans une variable de chaîne à la place, donc je peux utiliser la sortie dans d'autres parties du code. Je pourrais simplement rouvrir le fichier texte et lire son contenu, mais c'est stupide, je veux arrêter d'écrire dans un fichier et juste enregistrer dans une variable de chaîne immédiatement.

La fonction d'écriture

/* the function to invoke as the data received */ 
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { 
    size_t written; 
    written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 

Le code entier

#include <iostream> 
#include "curl/curl.h" 

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

#include <iostream> 
using namespace std; 

/* the function to invoke as the data recieved */ 
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { 
    size_t written; 
    written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 

int main(int argc, char *argv[]) { 

    CURL *curl; 
    FILE *fp; 
    CURLcode res; 

    curl = curl_easy_init(); 

char outfilename[FILENAME_MAX] = "C:\\Users\\admin\\Downloads\\bbb.txt"; 

    if(curl) { 
char *response = NULL; 

     fp = fopen(outfilename,"wb"); 
     curl_easy_setopt(curl, CURLOPT_URL, "http://www.*hidden*.org/wp-test/lalala.txt"); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
     res = curl_easy_perform(curl); 

     curl_easy_cleanup(curl); 
     fclose(fp); 


    } 
    return 0; 
} 

j'espérais aussi quelqu'un pourrait expliquer comment cette fonction est utilisée, exactement. Je suis habitué (de php et vb.net) à une fonction comme ceci:

function1(ThisIsAvariable,ThisIsAvariableToo) 
{ 
    if ThisIsAvariable = something 
    { 
     Print "gogopowerrrangers" *append* ThisIsAvariableToo 
    } 
}; 

qui serait alors utilisé comme:

function1(PassThisAsVariable1,PassThisAsVariable2); 

Mais dans le code ci-dessus, la fonction

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) 

est simplement appelé comme celui-ci

write_data 

Comme vous pouvez le voir ici:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 

Alors, pourquoi tout cela?

(void *ptr, size_t size, size_t nmemb, FILE *stream) 

ne se recourbe « remplir » automatiquement ceux ou fonctionne C/C++ différemment avec les fonctions que la plupart des autres langues?

Répondre

10

Vous pouvez utiliser un flux de chaîne pour enregistrer les données en mémoire. Vous devez créer le flux de chaîne dans main et lui passer un pointeur pour le recourber, comme si vous passez actuellement un pointeur vers un FILE.

std::ostringstream stream; 

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream); 

// call curl like before 
// ... 

// then get result as a std::string: 
std::string output = stream.get(); 

La fonction write_data fonction ressemblerait à ceci:

size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) { 
    std::ostringstream *stream = (std::ostringstream*)userdata; 
    size_t count = size * nmemb; 
    stream->write(ptr, count); 
    return count; 
} 

Et à propos de l'appel de la fonction, il fonctionne de la même manière que dans d'autres langues. Vous devez donner des paramètres à la fonction si vous l'appelez. La différence dans ce cas est que, dans curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data) la fonction write_data n'est pas appelée. write_data est donné à la place en tant que paramètre à curl_easy_setopt qui informe curl que devrait utiliser cette fonction quand il a besoin d'écrire des données.Plus tard, une fois que curl reçoit des données et veut écrire ces données, il appelle write_data avec tous les paramètres appropriés.

+0

Merci d'expliquer, ne peut pas encore le faire fonctionner, cependant. ** utilisation invalide de type incomplet 'struct std :: basic_ostringstream , std :: allocateur >' ** qui se passe à la ligne * stream-> write (ptr, count); * dans votre Fonction write_data. – natli

+2

Vous avez besoin de '#include ' pour obtenir la définition de 'std :: ostringstream'. – sth

+0

Merci, erreur débutant;) – natli

Questions connexes