datei kopieren



  • #include <iostream>
    #include <windows.h>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        ifstream a("orginal.mp3", ios_base::binary);
        ofstream b("kopie.mp3", ios_base::binary);
    
        if (a)
        {
            if (b)
            {
            a.seekg(0L, ios_base::end);
            unsigned long size = a.tellg();
            char *byte = new char[size];
            a>>byte;
            delete[] byte;
            byte = NULL;
            }
        }
    }
    

    ich möchte nun den inhalt von byte in eine datei schreiben, kriege aber mit diesem hier: byte>>b; einen fehler

    nur für die, die denken es gibt ja rdbuf.. ich kenne es, bin aber neugierig



  • Hallo,

    wo rufst du die Ausgabeoperation b<<byte denn auf? Den Auruf solltest du vor delete [] byte packen 😉

    MfG

    GPC



  • char *byte = new char[size];
            a>>byte;
            byte>>b;
            delete[] byte;
    

    |
    |
    |
    (wie geht eigentlich ein pfeil nach unten?)

    no match for operator >> in byte>>b



  • char* definiert keinen >> operator, du musst also b << byte schreiben. Trotzdem funktioniert deine Idee so nicht, da erstens wieder an den Anfang der Datei gehen muss, und der >> operator auch gar nicht weiß, wieviel Bytes erlesen, bzw. schreiben soll. Dazu gibt es die FUnktionen read und write:

    #include <iostream>
    #include <fstream>
    
    int main() {
        std::ifstream a("original.mp3", std::ios::binary);
        std::ofstream b("kopie.mp3", std::ios::binary);
    
        if(a && b) {
            char buf[256];
            do {
                a.read(buf, sizeof(buf));
                b.write(buf, a.gcount());
            } while(a);
        }
        else {
            std::cout << "Datei nicht gefunden!";
        }
    }
    

    Diese Möglichkeit verbraucht außerdem auch weniger RAM. (Kann aber sein dass sie langsamer ist)

    mfg.



  • warum muss ich an den anfang der datei gehen? ich habe doch den buffer da.?

    wenn ich den inhalt von dem buffer in die datei schreibe muss in den inhalt nicht kennen oder?



  • Ich hab's mal getestet, sie ist wirklich langsam:

    #include <iostream>
    #include <fstream>
    #include <boost/filesystem/operations.hpp>
    #include <ctime>
    
    int main() {
        std::ifstream a("original.wmv", std::ios::binary);
        std::ofstream b("kopie.wmv", std::ios::binary);
    
        if(a && b) {
            time_t start = time(0);
            char buf[256];
            do {
                a.read(buf, sizeof(buf));
                b.write(buf, a.gcount());
            } while(a);
            std::cout << "Zeit: " << time(0) - start << " Sekunden" << std::endl;
            start = time(0);
            boost::filesystem::copy_file("original.wmv", "kopie2.wmv");
            std::cout << "Zeit: " << time(0) - start << " Sekunden" << std::endl;
        }
        else {
            std::cout << "Datei nicht gefunden!";
        }
    }
    

    Ausgabe:

    Zeit: 26 Sekunden
    Zeit: 8 Sekunden
    


  • mark`ler schrieb:

    warum muss ich an den anfang der datei gehen? ich habe doch den buffer da.?

    Da du mit seekg an das Ende gesprungen bist.

    wenn ich den inhalt von dem buffer in die datei schreibe muss in den inhalt nicht kennen oder?

    Ne wieso?

    mfg.



  • schon erledigt. habe einen schritt nicht berücksichtigt. habe ja noch nichts in den buffer geschrieben 🙂

    meine dummheit



  • So ist man sogar nen bisschen schneller als boost:

    #include <iostream>
    #include <fstream>
    #include <boost/filesystem/operations.hpp>
    #include <ctime>
    
    int main() {
        std::ifstream a("original.wmv", std::ios::binary);
        std::ofstream b("kopie.wmv", std::ios::binary);
    
        if(a && b) {
            time_t start = time(0);
            a.seekg(0, std::ios::end);
            std::streamsize size = a.tellg();
            char* buf = new char[size];
            a.seekg(0);
            do {
                a.read(buf, size);
                b.write(buf, a.gcount());
            } while(a);
            delete[] buf;
            std::cout << "Zeit: " << time(0) - start << " Sekunden" << std::endl;
            start = time(0);
            boost::filesystem::copy_file("original.wmv", "kopie2.wmv");
            std::cout << "Zeit: " << time(0) - start << " Sekunden" << std::endl;
        }
        else {
            std::cout << "Datei nicht gefunden!";
        }
    }
    

    Man muss halt nur den richtigen Mix aus RAM-Verbrauch und Geschwindigkeit finden.

    mfg.



  • #include <fstream>
    using namespace std;
    
    int main()
    {
       ifstream ein("original.wmv");
       ofstream aus("kopie.wmv");
       aus << ein.rdbuf();
       return 0;
    }
    

    🙂


Anmelden zum Antworten