Exakte (binäre) Deteikopie erstellen



  • Hallo!

    Ich versuche grade, eine einfach Funktion zu schreiben, die mir eine (exakte) kopie einer Datei erstellt. Per fstream kann ich die dateien ja im binärmodus öffnen und dann byteweise kopieren. Nur stimmt die kopie nicht mit dem original zusammen *confused*

    Der code (ausschnitt) ist hier:

    std::fstream fs;
        fs.open("test.jpg", std::fstream::binary | std::fstream::in);
    
        std::fstream fs2;
        fs2.open("out.jpg", std::fstream::binary | std::fstream::out);
    
        char c;
    
        while (fs.good())
        {
            fs >> c;
    
            fs2 << c;        
        }
    
        fs.close();
        fs2.close();
    

    Ideen wären fett!

    Grüße
    Pino



  • fstream hat keinen Überladenen >> bzw. << operator für char.

    Nimm einen anderen Datentyp oder mach es so:

    std::fstream fs;
        fs.open("test.jpg", std::fstream::binary | std::fstream::in);
    
        std::fstream fs2;
        fs2.open("out.jpg", std::fstream::binary | std::fstream::out);
    
        char c;
    
        while (fs.good())
        {
            c = fs.get(); // hier
    
            fs2.put(c);   // und hier
        }
    
        fs.close();
        fs2.close();
    


  • Einfacher:

    fs2 << fs.rdbuf();
    

  • Administrator

    blub² schrieb:

    fstream hat keinen Überladenen >> bzw. << operator für char.

    Unsinn!

    @ANGs_Pino,
    Das Problem ist, dass bei den Operator >> und << eine Formatierung durchgeführt wird. Sowas ist eher ungewollt, wenn man eine genaue 1:1 Kopie haben möchte. Entweder verwendest du die Lösung, welche seldon aufgezeigt hat, oder du arbeitest über einen Puffer:

    std::ifstream in("test.jpg", std::ios::binary);
    std::ofstream out("out.jpg", std::ios::binary);
    
    char buffer[4096];
    
    while(in.read(buffer, 4096))
    {
      out.write(buffer, in.gcount());
    }
    
    out.write(buffer, in.gcount());
    

    Grüssli



  • Dravere schrieb:

    blub² schrieb:

    fstream hat keinen Überladenen >> bzw. << operator für char.

    Unsinn!

    Argh, stimmt du hast Recht!
    Hab ich übersehen.


Anmelden zum Antworten