Dateien kopieren - eigene Methode [gelöst]



  • Hallo,
    ich habe ein eigentlich ganz einfaches Problem: genau genommen will ich nur eine Datei kopieren.
    Was das Ganze etwas komplizierter macht: Ich kann leider keine fertige Funktionen wie CopyFile() verwenden weil die Datei gelesen, übers internet mit sockets verschickt und am ziel-pc wieder geschrieben werden soll. Das heißt CopyFile() nützt mir hier nichts 😞

    mein bisheriger Ansatz sieht so aus:

    ifstream is("C:\\test\\test.jpg");
    ofstream os("C:\\test\\neu.jpg");
    
    if(is.is_open())
    {
    	while(!is.eof())
    	{
    		string zeile;
    		getline(is, zeile);
    		os<<zeile;
    		zeile.clear();
    	}
    }
    
    is.close();
    os.close();
    

    bei .txt-dateien geht das wunderbar, aber bei allen anderen Erweiterungen wie .exe, .jpg usw. geht das nicht mehr.
    Dabei kommen völlig unbrauchbare Dateien heraus 😞
    wie kopiert man solche Dateien ohne die fertigen Methoden zu verwenden?

    danke schonmal,
    andi01.



  • In Binärdateien stehen häufig Nullen, daher ist ein getline natürlich zwecklos.
    Wenn du die Dateien mit dem Flag ios::binary öffnest, sollte es klappen.

    Und da du später sowieso den Inhalt des Speichers in die Datei schreiben möchtest, hier ein Beispiel, wie man den kompletten Dateiinhalt in einen vector und anschließend in einem Rutsch die Datei schreibt.

    #include<vector>
    #include<iostream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        ifstream is("C:\\test\\test.jpg",ios::binary);
        ofstream os("C:\\test\\neu.jpg",ios::binary);
    
        if(is.good() && os.good())
        {
            is.seekg(0, ios::end);
            size_t length = is.tellg();
            is.seekg(0, ios::beg);
            vector<char> v;
            try {v.resize(length);}
            catch(bad_alloc&) {return -1;}
            is.read(&v[0],v.size());
            os.write(&v[0],v.size());
        }
    }
    

    Edit: includes ergänzt





  • danke, mit der Methode geht es perfekt 🙂

    lg,
    andi01.


Log in to reply