2010-11-18 3 views
1

wie mein Titel sagt, ich möchte die Ausgabe einer Locke zu einem Vektor zu speichern .. kann any1 bitte geben Sie mir einen Beispielcode? Ich konnte es in einer Struktur in c speichern. aber ich möchte es in einem Vektor speichern, der auch in C++ und ich bin ein wenig unruhig mit C++.speichern Sie die Ausgabe einer Locke führen zu einem Vektor <string> in C++

vector<string> contents; 

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
int numbytes = size*nmemb; 
char lastchar = *((char *) ptr + numbytes - 1); 
*((char *) ptr + numbytes - 1) = '\0'; 
contents.push_back((char *)ptr); 
*((char *) ptr + numbytes - 1) = lastchar; // Might not be necessary. 
return size*nmemb; 
} 



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

vector<string>::iterator i; 

CURL* curl = curl_easy_init(); 
if(curl) 
    { 
    curl_easy_setopt(curl,CURLOPT_URL, argv[1]); 
    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,handle_data); 
    CURLcode res = curl_easy_perform(curl); 
    curl_easy_cleanup(curl); 
    if (res == 0){ 
     for(i=contents.begin();i!=contents.end();i++) 
      cout << *i << endl; 
    }else 
     cerr << "Error: " << res << endl; 
    } 
return 0; 
} 
+0

Was ist ein "curl perform"? Ist es am Leben und wackeln? Kann ich es essen? Oder hat es eine Unterschrift? Warum zeigen Sie uns nicht, was Sie haben, und die Signatur der Curl-Funktionen, die Sie aufrufen müssen, plus die Datenstrukturen, in denen die Ergebnisse landen sollen? So wie es ist, erfordert Ihre Frage Kenntnis von C++ _and_ curl. Und es gibt erheblich weniger C++ - Programmierer, die Locken kennen als C++ - Programmierer. – sbi

+1

@sbi, ich glaube wirklich nicht, dass du Curl essen willst. Auf der anderen Seite habe ich gehört, dass Grepes zu dieser Jahreszeit lecker sind. –

+0

@sbi:: P .. wird Ihnen den Ausschnitt geben, den ich habe .. ich denke, es funktioniert .. hat einen Code, der Seite in String speichert. editiert, um in Vektor zu speichern. –

Antwort

1

Ich weiß nicht, Curl, also werde ich davon ausgehen, dass der Setup-Code korrekt ist. Also, was Sie wollen, ist die Callback-Funktion, um eine Zeichenfolge für jeden Block von Daten zu einem Vektor von Strings erhalten hinzufügen. Dies setzt auch voraus, dass die zurückkommenden Daten 8-Bit-Zeichen sind.

vector<string> contents; 

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    contents.push_back(string(static_cast<const char*>(ptr), size * nmemb)); 
    return size * nmemb; 
} 

der „Aufruf“ zu string() Konstruiert tatsächlich ein String-Objekt mit einem Zeiger und die Datenlänge initialisiert.

0

Hier ist, was Sie wahrscheinlich sind:

size_t handle_data(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    int numbytes = size*nmemb; 

    string temp(static_cast<char*>(ptr), nmemb); 

    contents.push_back(temp) 

    return size*nmemb; 
} 

Ich bin ziemlich sicher, dass Sie nicht in die Leere schreiben * ptr Sie von der CURL-Bibliothek übergeben sind. Und es sieht auch so aus, als ob Sie das letzte Zeichen der Speicheradresse mit '\ 0' überschreiben und dann den ursprünglichen Wert wieder einfügen, nachdem Sie zum Vektor gegriffen haben. Ich bin mir nicht sicher, dass dies wie erwartet funktionieren wird.

+0

@Ferruccio: Ich schätze du warst der schnellere Cowboy, also werde ich dir +1 geben :) – redeye

Verwandte Themen