CStdioFile WriteString()



  • Hallo

    Habe ein kleines Problem.
    (VS 2005 C++ / MFC)

    Ich versuche gerade ein kleines "Notepad" zu schreiben.
    Jetzt habe ich ein kleines Problem.
    Ich lese den Dateiinhalt mit fstream ein.

    Mit CStdioFile ----> WriteString()
    speichere ich den Inhalt in eine Datei.

    Wenn ich eine Datei öffne, bearbeite und speichere und anschliessend wieder öffne
    sieht sie ganz normal aus.
    Doch wenn ich sie wieder öffne, bearbeite, speichere und wieder öffne
    kommt an denn Stellen wo eine Zeile endet ein "Quadrat".

    Hier ein Beispiel:
    1)
    Datei öffnen und eine zweite Zeile schreiben.
    ---- Dateiinahlt ----
    erste zeile
    zweite zeile
    ---- !Dateiinahlt ----
    Datei speichern und schliessen.

    Datei öffnen und eine dritte Zeile schreiben.
    ---- Dateiinahlt ----
    erste zeile
    zweite zeile
    dritte zeile
    ---- !Dateiinahlt ----
    Datei speichern und schliessen.

    Datei öffnen und eine vierte Zeile schreiben.
    ---- Dateiinahlt ----
    erste zeile // Hier erscheint ein Quadrat
    zweite zeile
    dritte zeile
    ---- !Dateiinahlt ----
    Datei speichern und schliessen.

    Datei öffnen..
    ---- Dateiinahlt ----
    erste zeile // Hier erscheinen 2 Quadrate
    zweite zeile // Hier erscheint ein Quadrat
    dritte zeile
    vierte zeile
    ---- !Dateiinahlt ----

    usw..

    Kommt jemand nach was ich meine? 😕

    Gruss



  • Hm du musst beim Zeilenumbruch drauf achten, dass Windows das ja gern als \n\r kodiert und nicht nur als \n.
    Nun weis ich nicht welches Steuerelement du zur Ansicht nimmst: CEdit oder CRichEdit. Bei dem CEdit tritt glaube der von dir beschriebene Effekt auf.



  • Danke für die Schnelle Antwort.
    Ja. Beim einlesen einer Zeile füge ich immer ein \r\n an.
    (Öffnen und Datei in CEdit anzeigen hat bis jetzt noch nie Fehler verursacht.)
    Erst seit ich die Speichern-Funktion geschrieben habe.
    Diese sieht so aus:

    CStdioFile writeFile(strFileName, CFile::modeCreate | CFile::modeWrite);
    	writeFile.WriteString(strText);
    	writeFile.Close();
    


  • Wenn ich einen Breakpoint in der Schreibfunktion einfüge,
    und die CString Variable strText unter die Lupe nehme hat es auch diese Quadrate drin.
    Sollte das die WriteString Funktion nicht irgendwie erkennen?


  • Mod

    Wenn Du CStdioFile ohne den typeBinary öffnest wird ein \n immer in eine \r\n Sequenz expandiert. Das wird dann natürlich falsch beim wiedereinlesen wenn es bereits \r\n Sequenzen waren!

    Also einfach Datei mit typeBinary öffnen!



  • Super. Hat geklappt.
    Doch jetzt klappt das einlesen nicht (fstream). :-S
    (Andere Textfiles (vom System usw..) werde aber korrekt angezeigt.)
    Die Datei sieht im Notepad korrekt aus. Aber in meine Editor nicht.
    Ist wohl am besten wenn ich die lese Funktion auch auf cstdiofile umschreibe?!?

    Lese-Funktion

    fstream readFile;
    
    	readFile.open(strFileName);
    	bSetNewLine = FALSE;
    
    	strWindowText = "";
    	while(readFile.getline(strStream, 1024))
    	{
    		if(bSetNewLine == FALSE)
    		{
    			bSetNewLine = TRUE;
    		}
    		else
    		{
    			strWindowText += "\r\n";
    		}
    		strWindowText += CString(strStream);
    	}
    	readFile.close();
    	delete readFile;
    

    EDIT:
    Ja.. jetzt mit CStdioFile::ReadString() funktioniert es!

    Vielen Dank!


Anmelden zum Antworten