link aus textdatei lesen und runterladen



  • Hallo,

    eigentlich will ich eine datei, die mir eine textdatei runterlädt, einen einzeiligen link einliest und die datei dann in ein temporäres verzeichnis runterladen.
    Kann mir bitte jemand helfen? Normales herunterladen kriege ich hin, aber ich kann den link nicht von einer datei einlesen und verwenden =/...

    std::wstring inside;
    		ifstream infile;
    		infile.open(loadme);
    		while (!infile.eof) 
    		{
    			getline(infile, inside); 
    			std::wstring url4(L""); 
    
    			std::wstring loadme = env(_TEXT("TEMP")); 
    			loadme += (L"\\test\\file.exe");
    
    			url4 += inside.c_str(); 
    			HRESULT hr2 = URLDownloadToFile(NULL, (url4.c_str()), (loadme.c_str()), 0, NULL); //Download-Start
    		}
    		infile.close();
    		system("pause");
    
    1>------ Erstellen gestartet: Projekt: load, Konfiguration: Debug Win32 ------
    1>  stdafx.cpp
    1>  load.cpp
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(44): error C2276: "!": Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): error C2784: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "std::basic_istream<_Elem,_Traits> &" konnte nicht von "std::ifstream" hergeleitet werden.
    1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(157): note: Siehe Deklaration von "std::getline"
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): error C2782: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)": template-Parameter "_Elem" ist mehrdeutig.
    1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(157): note: Siehe Deklaration von "std::getline"
    1>  e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): note: kann "wchar_t" sein
    1>  e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): note: oder "char"
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): error C2780: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)": Erwartet 3 Argumente - 2 unterstützt
    1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(146): note: Siehe Deklaration von "std::getline"
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): error C2784: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "std::basic_istream<_Elem,_Traits> &&" konnte nicht von "std::ifstream" hergeleitet werden.
    1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(126): note: Siehe Deklaration von "std::getline"
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): error C2782: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)": template-Parameter "_Elem" ist mehrdeutig.
    1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(126): note: Siehe Deklaration von "std::getline"
    1>  e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): note: kann "wchar_t" sein
    1>  e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): note: oder "char"
    1>e:\programmierung\c++\youtubetraining\load\load\load.cpp(46): error C2780: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)": Erwartet 3 Argumente - 2 unterstützt
    1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\string(73): note: Siehe Deklaration von "std::getline"
    ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    

    Vielen Dank für die Hilfe



  • Zeile 44 die Klammern hinter eof vergessen und dann kannst du auch nicht so einfach die wide strings mit den normalen streams nutzen. Entweder std::string nutzen oder std::wifstream für die Datei.



  • Ich würde getline als Bedingung für die while Schleife nehmen:

    while (getline(...))
    {
        ...
    }
    

    Ich weiß auch nicht was in deinem speziellen Fall ist, aber normalerweise sollte man auch sicherstellen dass die Eingabe gültig ist, bevor man sie verarbeitet.

    Ich kenne mich auch nicht wirklich in dem Gebiet aus, aber beliebig websites downloaded von links in txt files hört sich für mich nach Sicherheitsrisiko an.



  • risiken und absicherungen sind in dem umfeld nicht wichtig. es soll einfach nur die datei laden.



  • inhalt von loadme.txt:
    http://seite.de/TeamSpeak3-Client-win64-3.0.18.exe

    <überdermain>
    std::wstring s2ws(const std::string& s)
    {
    	int len;
    	int slength = (int)s.length() + 1;
    	len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
    	wchar_t* buf = new wchar_t[len];
    	MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    	std::wstring r(buf);
    	delete[] buf;
    	return r;
    }
    </überdermain>
    main...
    
    	std::string inside;
    	ifstream infile;
    	infile.open(loadme);
    	while (!infile.eof()) 
    	{
    		getline(infile, inside); 
    		std::string url4(""); 
    		std::wstring loadme = env(_TEXT("Temp")); //TempOrdner
    		loadme += (L\\test\\file.exe");
    		url4 += inside; 
    		std::wstring stemp = s2ws(url4);
    		LPCWSTR result = stemp.c_str();
    		HRESULT hr2 = URLDownloadToFile(NULL, (result), (loadme.c_str()), 0, NULL); //Download-Start
    	}
    	infile.close();
    return 0;
    

    Funktioniert
    Danke


Log in to reply