Problem beim Speichern einer Datei



  • Hallo, ich habe mal eine Frage.
    was sind die Probleme, die auftauchen wenn ich eine Datei als Textmodus Speiche und die selbe Datei als Binärmodus wieder lese.
    Hier ein Beispiel

    #include <iostream>
    #include <fstream>
    using namespace std;

    int main()
    {

    int Zahlen[3] = { 15,2660,38 };
    
    
    ofstream schreiben;
    ifstream lesen;
    
    
    cout << "Problem beim speichern im Textmodus: " << endl << endl;
    cout << "Ausgabe der Zahlen im Array dezimal und binaer" << endl << endl;
    
    for (int j = 0; j < 3; j++)
    {
    	cout << "Dez: " << Zahlen[j] << "   binaer: ";
    	for (int i = 31; i >= 0; i--)
    	{
    		if ((i + 1) % 8 == 0) cout << ".";
    		if (Zahlen[j] & (1 << i))
    			cout << 1;
    		else
    			cout << 0;
    	}
    	cout << endl << endl;
    }
    
    cout << "------------------------------------------------------" << endl;
    cout << "Zahlen im Textmodus schreiben und im Binaermodus lesen" << endl;
    cout << "------------------------------------------------------" << endl;
    schreiben.open("Zahlen.zal", ios::out);
    if (schreiben)
    {
    	schreiben.write((char*)Zahlen, 12);
    	schreiben.close();
    }
    
    lesen.open("Zahlen.zal", ios::in | ios::binary);
    if (lesen)
    {
    	lesen.read((char*)Zahlen, 12);
    	lesen.close();
    }
    
    cout << "Ausgabe der Zahlen im Array dezimal und binaer" << endl << endl;
    
    for (int j = 0; j < 3; j++)
    {
    	cout << "Dez: " << Zahlen[j] << "   binaer: ";
    	for (int i = 31; i >= 0; i--)
    	{
    		if ((i + 1) % 8 == 0) cout << ".";
    		if (Zahlen[j] & (1 << i))
    			cout << 1;
    		else
    			cout << 0;
    	}
    	cout << endl << endl;
    }
    
    cout << "------------------------------------------------------" << endl;
    cout << "Selbe Datei im Textmodus gelesen" << endl;
    cout << "------------------------------------------------------" << endl;
    
    
    lesen.open("Zahlen.zal", ios::in);
    if (lesen)
    {
    	lesen.read((char*)Zahlen, 12);
    	lesen.close();
    }
    
    cout << "Ausgabe der Zahlen im Array dezimal und binaer" << endl << endl;
    
    for (int j = 0; j < 3; j++)
    {
    	cout << "Dez: " << Zahlen[j] << "   binaer: ";
    	for (int i = 31; i >= 0; i--)
    	{
    		if ((i + 1) % 8 == 0) cout << ".";
    		if (Zahlen[j] & (1 << i))
    			cout << 1;
    		else
    			cout << 0;
    	}
    	cout << endl << endl;
    }
    
    system("pause");
    return 0;
    

    }



  • @Lawand sagte in Problem beim Speichern einer Datei:

    was sind die Probleme, die auftauchen wenn ich eine Datei als Textmodus Speiche und die selbe Datei als Binärmodus wieder lese.

    Gibt es welche?



  • Wenn Du unter Windoof nicht klar kommst, daß Du Cariage Return und Line Feed als zwei getrennte Zeichen geliefert bekommst.


  • Mod

    Funktioniert es denn? Falls ja, dann reine Glückssache. Was der binary-Modifier macht ist, dass er dem Stream verbietet, die Daten in irgendeiner Form anzufassen. Im Textmodus darf der Stream Zeichen verändern, wenn er das für richtig hält. Wenn es also auf jedes einzelne Byte exakt ankommt, muss man im binary-Modus lesen und schreiben. Gemischt geht nicht gut, denn dann bekommt man Transformationen rein, wo keine sein sollten.

    Praktische Anwendung finden die Transformationen nur unter Windows und nur für das Newlinezeichen '\n', welches vom Stream nach "\r\n" (oder war es "\n\r"? Egal.) übersetzt wird, bzw. beim Lesen dann wieder rückwärts. Wenn du nicht unter Windows arbeitest, oder deine Daten keine '\n' enthalten, dann kann das schonmal trotzdem gut gehen, wenn man Bytemuster im Textmodus verarbeitet. Muss es aber nicht, und man sollte es lieber gleich richtig machen.



  • @SeppJ sagte in Problem beim Speichern einer Datei:

    das Newlinezeichen '\n', welches vom Stream nach "\r\n" (oder war es "\n\r"? Egal.) übersetzt wird

    Ich habe die Klammer mal durchgestrichen. Erst CR, dann LF. 13, 10. Oder 0D, 0A.



  • @wob sagte in Problem beim Speichern einer Datei:

    Ich habe die Klammer mal durchgestrichen. Erst CR, dann LF. 13, 10. Oder 0D, 0A.

    Ja, korrekt - wenn auch etwas unlogisch. Der Hebelmechanismus für die neue Zeile der alten, mechanischen Schreibmaschinen hat zuerst die Walze eine Zeile weiter gedreht (Line Feed) und erst danach hat man mit dem Druck den Wagen wieder an den Anfang der Zeile geschoben (Carriage Return) ... mag aber durchaus auch andere Mechaniken gegeben haben, bei denen es umgekehrt war. Ich denke die beiden genannten ASCII-Zeichen orientieren sich eher an diesen schreibmaschinenartigen Drucker-Terminals früher Computer 😉


  • Mod

    @Finnegan sagte in Problem beim Speichern einer Datei:

    Ich denke die beiden genannten ASCII-Zeichen orientieren sich eher an diesen schreibmaschinenartigen Drucker-Terminals früher Computer 😉

    Nicht nur "eher orientiert", sondern sogar exakt dafür gemacht 🙂
    Bzw. noch genauer ist das ein Protokoll für Fernschreiber. Was aber das gleiche ist, bloß dass man einen Telegrafen anstatt eines Computers angeschlossen hat.



  • @SeppJ
    ASCII ist an das Fernschreiberprotokoll angelehnt, aber für Telex wurde eine 5Bit Kodierung genutzt.


Anmelden zum Antworten