Ich baue eine Anwendung (auf Windows mit Dev-C++) und ich möchte, dass es eine Datei herunterladen. Ich mache das mit libcurl (Ich habe den Quellcode bereits mit Packman installiert). Ich habe ein funktionierendes Beispiel gefunden (http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in-c-using-libcurl/), aber es schließt die Datei nicht, nachdem der Download abgeschlossen ist. Ich möchte, dass jemand ein Beispiel gibt, wie man eine Datei entweder in C oder C++ herunterlädt. Danke im Voraus!Datei mit libcurl in C/C++ herunterladen
Antwort
Das von Ihnen verwendete Beispiel ist falsch. Siehe die Manpage für easy_setopt. Im Beispiel verwendet write_data seine eigene FILE, * outfile und nicht die fp, die in CURLOPT_WRITEDATA angegeben wurde. Deshalb verursacht das Schließen von fp Probleme - es ist nicht einmal geöffnet.
Dies ist mehr oder weniger, was es (hier ohne Libcurl zu testen) aussehen sollte
#include <stdio.h>
#include <curl/curl.h>
/* For older cURL versions you will also need
#include <curl/types.h>
#include <curl/easy.h>
*/
#include <string>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
int main(void) {
CURL *curl;
FILE *fp;
CURLcode res;
char *url = "http://localhost/aaa.txt";
char outfilename[FILENAME_MAX] = "C:\\bbb.txt";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
Aktualisiert: wie von @rsethc types.h
und easy.h
vorgeschlagen sind nicht in cURL Versionen nicht mehr.
Ich habe versucht, diese (unter OSX), aber ich bin immer: Warnung: veraltet Konvertierung von String-Konstante 'char *' undefinierte Symbole: "___gxx_personality_v0", verwiesen von: _main in ccHRyU1T.o write_data (void *, unsigned lang, unsigned lang, __sFILE *) in ccHRyU1T.o CIE in ccHRyU1T.o ld: Symbol (e) nicht gefunden collect2: ld gab 1 Exit-Status zurück Hilfe bitte !! – TCB13
@ TCB13 das Programm, das ich schrieb, ist C, nicht C++. Kompiliere als C neu und die Probleme sollten beide verschwinden. – fvu
+1, weil ich glaube, dass das OP dies als die Antwort ausgewählt haben sollte, weil der Code ziemlich genau derselbe ist. – alexy13
Nur für diejenigen, die interessiert sind, können Sie vermeiden, benutzerdefinierte Funktion zu schreiben, indem Sie NULL als letzten Parameter übergeben (wenn Sie nicht beabsichtigen, zusätzliche Verarbeitung von zurückgegebenen Daten zu tun).
In diesem Fall wird die interne Standardfunktion verwendet.
Einzelheiten
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA
Beispiel
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
FILE *fp;
CURLcode res;
char *url = "http://stackoverflow.com";
char outfilename[FILENAME_MAX] = "page.html";
curl = curl_easy_init();
if (curl)
{
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
Dies funktioniert nicht auf Windows: Unter Windows müssen Sie einstellen Die CURLOPT_WRITEFUNCTION ist nicht null, sonst tritt ein Absturz auf. Siehe https://curl.haxx.se/libcurl/c/CURLOPT_WRITEDATA.html –
@PhilRosenberg und das klingt unglücklich, denn hier https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html # DESCRIPTION besagt eindeutig: "Setzen Sie diese Option auf NULL, um die interne Standardfunktion zu erhalten, die anstelle Ihres Callbacks verwendet wird." So "Wenn Sie libcurl als Win32-DLL verwenden, MÜSSEN Sie CURLOPT_WRITEFUNCTION verwenden, wenn Sie diese Option festlegen oder du wirst Abstürze erleben. " sollte keine Wirkung haben, da wieder interne Funktion verwendet werden sollte. – Petar
wollte ich Ihre Frage stimmen, aber Ihre Antwort hat mich nicht. –