Hilfe bei String-Kuriuosum



  • Hallo

    ich will einen CString mittels CStdioFile öffnen

    der String repräsentiert einen kompletten Notepadeintrag incl. formatierung.

    wenn ich mir nach dem ersten abspeichern die Datei im HEX Editor ansehe,
    dann stehen dort "0d 0d 0a"'s an manchen stellen des Strings.

    Wenn ich diese Dateie einlese, dann geht es schonmal so los,
    das er mittels openFile.ReadString(strTemp) immer bei diesen "0d 0d 0a"'s eine neue Zeile einliest, und ich schonmal den neuen String umständlich selber wieder zusammenbauen muss.

    in meinem Notepad steht das ganze dann auch wieder richtig drinnen.

    So - nur wenn ich nun einen neuen Eintrag mache, dann wird der neue Eintrag auch wieder richtig gespeichert, aber die alten Einträge haben lauter returns, oder je nachdem was ich versuche einzubauen, um das selbe File wieder hinzubekommen.

    Ich hab auch hier im Forum schon was dazu gefunden, bin aber nicht schlau draus geworden...

    Wie kann ich den String 1:1 in ein File schreiben, und daraus wieder genauso (egal ob cr's oder lf's drinnen sind) auslesen ?

    Und warum ist bei mir kein Unterschied zwischen

    CStdioFile openFile;
    if(openFile.Open(fileName, CFile::modeRead | CFile::typeBinary)){

    und

    CStdioFile openFile;
    if(openFile.Open(fileName, CFile::modeRead | CFile::typeText)){

    Wäre sehr dankbar für Antworten 🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Tja eigentlich habe ich ja ins C++ Forum geschrieben, da ich gehofft habe, dort eine allgemeine Lösung für mein Problem zu finden.

    Ich geben mich auch sehr gerne mit einer nicht MFC Klassenlösung zufrieden, daher habe ich nicht ins MFC gepostet. Mein Problem besteht in der Darstellung eines Strings, das ein absolut allgemeines Problem ist, und eigentlich mit MFC garnichts zu tun hat....


  • Mod

    Vielleicht solltest Du einfach mal die Doku zu EM_FMTLINES lesen:
    http://msdn2.microsoft.com/en-us/library/aa453003.aspx

    Notepad ist nichts anderes als ein Edit Control, und was Du dort siehst sind Soft-Line-Breaks!

    Ansonsten müsstest Du mit CStdioFile typeBinary exakt die Daten so bekommen wie sie in der Datei stehen. Was das Edit Control daraus macht ist was anderes!



  • Ok vielen Dank, es geht nun mit Binary, wenn ich dann die \n 's wieder hinzufüge.
    Dann erhalte ich zwar noch eine zusätzliche Leerzeile (wenn ich die wegmache, hat aber der string nicht mehr die selbe länge wie vorher) die ich aber beim einlesen einfach auslassen kann.

    Auf jeden Fall wird nun mein Notepad ( ja richtig es ist ein CRichEditCtrl ) nun mit den alten Daten wieder korrekt befüllt.

    Ich bin zwar immer noch verwirrt, aber glücklich das es jetzt geht 🙂



  • wie wär's, wenn du dir einfach mal die Beschreibung von ReadString durchliest?
    http://msdn2.microsoft.com/en-us/library/x5t0zfyf(VS.80).aspx
    Spezielles Augenmerk bitte auf die Remarks-Sektion...!



  • Das habe ich schon, nur leider problematisch, wenn der String sich zur Laufzeit ständig ändert und man kein char[] initialisieren kann.
    Ausserdem besteht der String den ich speichere ja selbst auch aus einem mix aus buchstaben und escape characters, und beim einlesen interpretiert readstring diese escape characters als endlines und beendet das einlesen der Zeile, aber das character selbst brauche ich ja noch.. daher muss ichs ja wieder hinter dran klatschen, damits wieder stimmt...
    Und im Hex Editor stand ja ein \n und kein \0 im Original...



  • Ja, aber genau das steht doch dort: ReadString liest bis zum ersten newline character. Und wenn in deiner Datei ein \n steht, dann ist das ein newline character...!
    Wenn du wirklich exakt das haben willst, was in der Datei steht, dann musst du eben Read verwenden. Wieso du keinen char initialisieren kannst, verstehe ich nciht.



  • Ja ich wollte das ursprümglich auch mit Read lösen.

    Ich habe dann geschrieben

    readTextSize = atoi(strTemp); // Das Problem war hier
    CStdioFile openFile;
    char pbuf[readTextSize ];
    
    openFile.Read( pbuf, readTextSize );
    

    die Länge des Strings steht ja auch mit im File, und so konnte ich das Array nicht initialisieren, weil ich ja garnicht weiss wie groß es ist.

    Da ICH keinen dynamischen Array anlegen kann, habe ich halt die Zeichen wieder drangefügt, was zumindest im binärmode ging...



  • Multiplex schrieb:

    Ja ich wollte das ursprümglich auch mit Read lösen.

    Ich habe dann geschrieben

    readTextSize = atoi(strTemp); // Das Problem war hier
    CStdioFile openFile;
    char pbuf[readTextSize ];
    
    openFile.Read( pbuf, readTextSize );
    

    Das ist so auch nicht moeglich

    char pbuf[readTextSize]; // readTextSize muss bereits zur compilezeit bekannt sein
    //um es dynamisch zu machen
    char *pbuf = new char[readTextSize];
    // work with the pointer pbuf
    delete [] pbuf;
    pbuf = 0;
    


  • OK vielen Dank.
    Da ich jetzt allerdings noch viel vor mir habe, weiss ich nicht, ob ich das nun ändern soll, und wieder (vielleicht stunden) damit zu verbringen, bis es dann wieder so geht wie jetzt 😛
    Aber bei meinen nächsten Projekten werde ich mir das im Hinterkopf behalten 🙂

    Danke nochmals


  • Mod

    Oder man ermittelt einfach mit CFile:GetStatus die Dateigröße und allokiert den Buffer entsprechend.



  • CFile::GetLength sollte auch tun


Anmelden zum Antworten