Frage über Escape-Sequenzen



  • Ich hätte mal eine Frage, und zwar ist mir aufgefallen das wen man aus einer Textdatei einen Text einliesst, die ganzen Escape-Sequenzen nicht mehr gehen.
    Ich wollte mal fragen wieso das so ist?

    Hier mal ein beispiel code von mir falls jemand nicht weis was ich meine...

    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        FILE *filePtr; 
    	char* FileName = "Text.txt";
    	char Text[128];
    
        filePtr = fopen(FileName,"r"); 
    
        if(filePtr != NULL) 
        {
    		fgets(Text, 256, filePtr); 
    		fclose(filePtr); 				
    	}
    
    	// Funktioniert Super
    	cout << "Hello World \nmit Zeilenumbruch!" << endl;
    	// in der Textdatei steht "\nmit Zeilenumbruch!" macht aber kein Zeilenumbruch 
    	cout << "Hello World " << Text;
    
    	system("PAUSE");
    }
    


  • Funktioniert doch wunderbar mit C++. 😉

    #include <fstream>
    
    int main()
    {
     std::ofstream out ("test.txt");
     out << "hmm\nmit umbruch. ;)";
    
    }
    


  • In der Textdatei werden diese Escape Sequenzen umgewandelt. Wenn du ein \n in einer Textdatei haben willst, drück einfach Enter im Texteditor, dann schreibt er dir das \n rein. Ist aber wie gesagt nicht sichtbar für dich, nur in Form einer neuen Zeile.



  • Ich denke, dass in der Datei vorher quasi "\\nmit Zeilenumbruch!" steht. Und dann ließt er es ein und hat natürlich in Text immer noch ein "\\n..." und kein "\n..." stehen.
    Er fragt also warum die Escape-Sequenzen in der Textdatei nicht irgendwie[tm] konvertiert werden, so dass ein "\\n" in der Textdatei einen Zeilumbruch im Programm gleichkommt...
    Wieso das allerdings passieren sollte, ist mir schleierhaft 🙄



  • Wenn in der Textdatei wörtlich das "\n" mit drinsteht, dann sind das zwei Zeichen, die ausgelesen werden und auch so wieder ausgegeben werden. Das entspricht dem Verhalten was du hast, wenn im Code "\\n" stünde. Das sind auch wieder zwei Zeichen, nämlich einmal '\' und 'n', während '\n' ein einzelnes Zeichen ist, das für den Zeilenumbruch steht. Die Maskierung funktioniert nur im Quellcode selber, um die Literale für Backslashes, Newlines und andere Steuerzeichen darstellen zu können.

    PS: <stdio.h> ist ein reiner C-Header und sollte in C++ nicht benutzt werden. Der C++-Header für den C-Style I/O wäre <cstdio>. Ich würd aber den C++-I/O nutzen, nämlich streams (in dem Fall <fstream>).



  • pumuckl schrieb:

    Wenn in der Textdatei wörtlich das "\n" mit drinsteht, dann sind das zwei Zeichen, die ausgelesen werden und auch so wieder ausgegeben werden. Das entspricht dem Verhalten was du hast, wenn im Code "\\n" stünde. Das sind auch wieder zwei Zeichen, nämlich einmal '\' und 'n', während '\n' ein einzelnes Zeichen ist, das für den Zeilenumbruch steht. Die Maskierung funktioniert nur im Quellcode selber, um die Literale für Backslashes, Newlines und andere Steuerzeichen darstellen zu können.

    PS: <stdio.h> ist ein reiner C-Header und sollte in C++ nicht benutzt werden. Der C++-Header für den C-Style I/O wäre <cstdio>. Ich würd aber den C++-I/O nutzen, nämlich streams (in dem Fall <fstream>).

    Danke für die erkläreung, gibt es dann kein weg ein Zeilenumbruch aus einer Textdatei zu machen?


  • Mod

    Daniel86 schrieb:

    Danke für die erkläreung, gibt es dann kein weg ein Zeilenumbruch aus einer Textdatei zu machen?

    Erkläre mal bitte ganz genau, was du vor hast. Es gibt garantiert einen Weg, aber ich glaube du hast die meisten Leute hier ziemlich verwirrt was deine Ziele angeht.



  • SeppJ schrieb:

    Daniel86 schrieb:

    Danke für die erkläreung, gibt es dann kein weg ein Zeilenumbruch aus einer Textdatei zu machen?

    Erkläre mal bitte ganz genau, was du vor hast. Es gibt garantiert einen Weg, aber ich glaube du hast die meisten Leute hier ziemlich verwirrt was deine Ziele angeht.

    Eigentlich sehr einfach, mein Programm lädt eine Textdatei von meinem Server und soll den Text dannn ausgeben.
    Was ja auch klappt aber wie gesagt, habe ich dann gesehen, das die Zeilenumbrüche nicht mit den Escape-Sequenzen gehen.

    Ich hoffe ich konnte es gut erklären...



  • So ich habe jetzt nochmal gegoogelt und eine Lösung gefunden und danke für eure hilfe.

    Textdatei kann z.B. so ausehen:
    "Text mit
    Zeilenumbruch"

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main() 
    { 
        char* FileName = "Text.txt"; 
        char Text[128]; 
    
        ifstream infile (FileName, ios::in);
    
        if(infile != NULL) 
        { 
    		while (infile.getline (Text, 128))
    		{
    			cout << Text << endl;
    		}
        } 
    
        system("PAUSE"); 
    }
    


  • Benutze besser gleich std::string statt dem char-Array, damit du beliebig lange Zeilen einlesen kannst (s.a. http://www.c-plusplus.net/forum/viewtopic-var-t-is-248452-and-highlight-is-getline.html)


Anmelden zum Antworten