2011-11-05 14 views
6

Al no obtener curlpp para trabajar en C++, he decidido empezar a usar libcurl con C en su lugar (por ahora). Siendo completamente nuevo en C y C++, esto se está volviendo un poco confuso. Ni siquiera estoy seguro de si puedo mantener las funciones C y C++ separadas, pero hasta donde sé, esto es puro C.libcurl salida a la variable en lugar de archivo de texto

Con la ayuda de un amigo, he logrado escribir el resultado (contenido de la página que Curl recogido) a un archivo de texto, pero quiero ponerlo en una variable de cadena en su lugar, por lo que puedo usar la salida en otras partes del código. Podría simplemente volver a abrir el archivo de texto y leer su contenido, pero eso es una tontería, quiero dejar de escribir en un archivo y simplemente guardarlo en una variable de cadena inmediatamente.

La función de escritura

/* 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; 
} 

El código completo

#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; 
} 

También esperaba que alguien podría explicar de qué forma se utiliza esta función, exactamente. Estoy acostumbrado (de php y vb.net) a una función como esta:

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

que luego se utiliza como:

function1(PassThisAsVariable1,PassThisAsVariable2); 

Pero en el código anterior, la función

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

se llama simplemente como esto

write_data 

Como puedes ver aquí:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 

¿Para qué sirve todo esto?

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

¿Curl "llena" automáticamente esos en C/C++ o funciona de manera diferente con funciones que la mayoría de los otros lenguajes?

Respuesta

10

Puede usar una secuencia de cadenas para guardar los datos en la memoria. Debería crear la secuencia de cadenas en main y pasarle un puntero para curl, como si actualmente pasara un puntero a 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(); 

El write_data función según se vería así:

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; 
} 

Y acerca de la función que llama, funciona básicamente de la misma manera como en otros idiomas. Tiene que dar parámetros a la función si la llama. La diferencia en este caso es que en curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data) no se llama a la función write_data. write_data se proporciona en cambio como un parámetro a curl_easy_setopt que informa al curl que debe usar esta función cuando necesita escribir datos.

Más tarde, una vez que Curl recibe datos y quiere escribir esos datos, llamará al write_data con todos los parámetros apropiados.

+0

Gracias por explicar, aunque todavía no lo puedo hacer funcionar. ** uso no válido del tipo incompleto 'struct std :: basic_ostringstream , std :: allocator >' ** que ocurre en la línea * stream-> write (ptr, count); * en su Función write_data. – natli

+2

Necesita '#include ' para obtener la definición de 'std :: ostringstream'. – sth

+0

Gracias, error de principiante;) – natli

Cuestiones relacionadas