fstream exe lesen und anschließend schreiben unterschiedlicher Inhalt.



  • Guten Morgen,

    Ich möchte eine Datei via fstream Kopieren und werde bei dieser einfachen Aufgabe echt noch blöd 😕 Jedoch haben die Dateien nach dem Kopieren eine andere CheckSum. CopyFileA und std::copy kann ich in diesem Fall leider nicht verwenden.

    Jedoch spricht Code mehr als 1000 Wrte also seht selbst.

    user@user:~$ g++ test.cpp -o test
    user@user:~$ ./test 
    user@user:~$ md5sum test
    5a0acf8e1e6cbfc20f954eeb0bd3b75b  test
    user@user:~$ md5sum test2 
    d41d8cd98f00b204e9800998ecf8427e  test2
    user@user:~$
    
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <string>
    
    int main() {
    	std::ifstream in;
    	in.open("./test", std::ios::in | std::ios::binary);
    	if (!in.is_open()) {
    		return 1;
    	}
    	std::stringstream stream;
    	stream << in.rdbuf();
    	std::string data = stream.str();
    	in.close();
    
    	std::ofstream out;
    	out.open("./test2", std::ios::out | std::ios::binary);
    	if (!in.is_open()) {
    		return 2;
    	}
    	out << data;
    	out.close();
    
    	return 0;
    }
    

    Vielen Dank!

    Grüße Unicode-Hater


  • Mod

    Die Dateigröße sollte dir schon den ersten Anhaltspunkt geben: Die Kopie hat nämlich 0 Bytes. Guck dir Zeile 19 nochmal genau an.

    P.S.: Warum überhaupt der doppelte Umweg über sowohl stringstream als dann auch nochmal über string? Mach doch einfach direkt

    out << in.rdbuf();
    


  • Das funktioniert. Danke! Wie kann ich nun aber den Inhalt der Datei die ich einlesen Manipulieren ohne den Inhalt mit den Stringstreams zu zerstören? Oder kann ich den Inhalt nicht in einen std::string einlesen?

    user@user:~$ g++ test.cpp -o test -Wall
    user@user:~$ ./test 
    user@user:~$ md5sum test
    cf68fbf77586a506860ae13285f09140  test
    user@user:~$ md5sum test2 
    cf68fbf77586a506860ae13285f09140  test2
    user@user:~$
    
    #include <iostream> 
    #include <fstream> 
    #include <sstream> 
    #include <string> 
    
    int main() { 
        std::ifstream in; 
        in.open("./test", std::ios::in | std::ios::binary); 
        if (!in.is_open()) { 
            return 1; 
        } 
    
        std::ofstream out; 
        out.open("./test2", std::ios::out | std::ios::binary); 
        if (!in.is_open()) { 
            return 2; 
        } 
        out << in.rdbuf(); 
        out.close();
        in.close();
    
        return 0; 
    }
    

    Grüße Unicode-Hater


  • Mod

    Den Tipp mit Zeile 19 (im neuesten Code Zeile 15) solltest du schon befolgen, dann funktioniert auch dein erstes Programm.



  • Manchmal dauert es bei mir etwas länger 😉 Aber hebe jetzt verstanden das ich in nicht schließen darf und dann prüfen in.is_open(). Da muss out.is_open() hin. Hat aber echt lange gedauert 😃

    Vielen Dank für die Geduld 😉


Anmelden zum Antworten