Text in Textfile einfügen



  • Hi to all

    VS6.0 MFC
    Problemstellung:

    CStdioFile fileo;
    fileo.ReadString(strOutput);
    strOutput = strOutput + "Rolf \t";
    fileo.WriteString(strOutput);
    fileo.Close();
    --> ich lese einen String aus einer Textdatei z.B. "Hallo \t"
    --> strOutput = "Hallo \t Rolf \t"
    --> strOutput in Textdatei wieder einfügen.

    Was passiert:
    1. gar nichts. 😮
    Es wird nichts geschrieben.
    Würde ich <fileo.ReadString(strOutput);> weglassen und strOutput direkt zuweisen, würde mir in der Textdatei alles überschrieben!

    Wie soll es aussehen:
    Textdatei:
    "Hallo 'TAB'" <-- Zeile 1
    "Wie geht es 'TAB'" <-- Zeile 2

    jetzt kommt mein Code....

    jetzt steht in der Textdatei:
    "Hallo 'TAB' Rolf 'TAB' <-- Zeile 1
    "Wie geht es 'TAB'" <-- Zeile 2

    Für Hilfe und Anregungen danke ich schon jetzt mal!
    Es grüsst
    Rolf



  • wie waere es mit:

    CStdioFile file;
    file.Open(FileString, CFile::modeReadWrite);
    

    amsonsten wuerde ich fstream bevorzugen {da kann man auch mit CStrings arbeiten}

    zb:

    std::ofstream file(csFile, std::ios::out|std::ios::app);
    file.write(csString, csString.GetLength());
    file.close();
    


  • ach sorry habe ich natürlich gemacht:

    CStdioFile fileo;
    fileo.Open(TEXT("C:\\MyDoc\\Textdatei.txt"), CFile::modeReadWrite|CFile::shareExclusive|CFile::typeBinary, &fileException))
    ...
    ...
    CString strOutput("");
    fileo.ReadString(strOutput);
    strOutput = strOutput + "Rolf \t";
    fileo.WriteString(strOutput);
    fileo.Close();

    wie gesagt, das Problem ist trotzdem da!
    --------
    weiter habe ich jetzt versucht:

    CString csFile = TEXT("C:\\MyDoc\\Textdatei.txt");
    CString csString = "AAA";
    std::ofstream file(csFile, std::ios::out|std::ios::app);
    file.write(csString, csString.GetLength());
    file.close();

    aber selbes Problem 🙄 -> es passiert gar nichts.
    Es wird nichts geschrieben.


  • Administrator

    Mr Evil schrieb:

    wie waere es mit:

    CStdioFile file;
    file.Open(FileString, CFile::modeReadWrite);
    

    amsonsten wuerde ich fstream bevorzugen {da kann man auch mit CStrings arbeiten}

    Und wieso sollte man bei CStdioFile nicht mit CStrings arbeiten können? Ich meine CString ist von der MFC und CStdioFile auch, da liegt es ja nahe, dass man CStrings brauchen kann, nicht? ^^

    @Rolf
    Desweitern kann man nicht einfach so auf eine Zeile zugreifen. Also wenn du ReadString machst, dann liest es eine Zeile weiter. Beim nächsten ReadString oder WriteString ist er auf er nächsten Zeile. Daher musst du entweder alles auslesen, die entsprechenden Zeilen verändern und die Datei leeren und wieder alles hineinschreiben. Oder du probierst etwas mit den CFile Seek Funktionen. Ich weiss leider nicht ob es geht, aber vielleicht könnte es mit einem SeekToBegin gehen. Also auslesen, manipulieren, seektobegin und danach hineinschreiben. Musst halt ein wenig ausprobieren.

    Edit: Hab gerade noch ein wenig getestet. Ok mit dem Seek geht es nicht, war eigentlich zu erwarten. Daher musst du wohl zuerst alles auslesen Datei, wieder schliessen, dann manipulieren, wieder öffnen mit CFile::modeCreate | CFile::modeWrite und dann wieder alles hineinschreiben.

    Vielleicht hat aber jemand noch eine besser Lösung auf Lager.

    Grüssli



  • Dravere schrieb:

    Mr Evil schrieb:

    wie waere es mit:

    CStdioFile file;
    file.Open(FileString, CFile::modeReadWrite);
    

    amsonsten wuerde ich fstream bevorzugen {da kann man auch mit CStrings arbeiten}

    Und wieso sollte man bei CStdioFile nicht mit CStrings arbeiten können?

    ich hab nicht gesagt das man das mit CStdioFile nicht kann - ich sagte auch

    da kann man auch mit CStrings arbeiten += wie bei CStdioFile && CFile

    #gg

    //dazuedit

    wie waer es mit append - haengt er immer an eine neue zeile an ? wenn kein \n ist muesste es nach meinem denken angehangen werden



  • Hi Dravere

    wenn ich mich nicht verguckt habe, habe ich Deinen Vorschlag auch schon ausprobiert.
    -Zitat: ALLES lesen, ändern, schreiben. ok. aber was wenn die Datei in Zukunft mal riesengross ist? (5,10,20MB)

    -Meine Frage:
    Wenn ich eine Textdatei mit einem Editor öffne, kann ich ja auch irgendwo neuen Text einfügen, ohne dass das bestehende überschrieben wird. (ausser Insert-Taste on) und die Zeile wird einfach etwas länger. Das wäre mein Wunsch.



  • habe mal folgendes probiert:

    Textdatei-Inhalt:
    111 TAB
    222 TAB
    333 TAB

    Programmcode:
    ...
    ...
    fileo.ReadString(strOutput)<=0;
    strOutput = strOutput + "AAA";
    fileo.Close();

    fileo.Open(TEXT("C:\\MyDoc\\Textdatei.txt"), CFile::modeReadWrite|CFile::shareExclusive|CFile::typeBinary, &fileException);
    fileo.WriteString(strOutput);
    fileo.Close();

    1. Das Schreiben hat zwar jetzt funktioniert, warum auch immer (Read, ändern und gleich wieder write macht wohl Probleme)
    2. Textdatei-Inhalt jetzt:
    111 TAB AAA2 TAB
    333 TAB

    wollte aber:
    111 TAB AAA
    222 TAB
    333 TAB



  • fileo.ReadString(strOutput)<=0;
    strOutput = strOutput + "AAA\n";
    fileo.Close();
    


  • Hi Mr Evil

    wird anschliessend strOutput wieder in das File geschrieben
    mit
    fileo.Open(TEXT("C:\\MyDoc\\Textdatei.txt"), CFile::modeReadWrite|CFile::shareExclusive|CFile::typeBinary, &fileException);
    fileo.WriteString(strOutput);
    fileo.Close();

    steht in der ersten Zeile zwar <111 TAB AAA> jedoch in der zweiten Zeile wurde die '222' gelöscht.

    Es muss wohl sein, ganzes File einlesen str.input ganzes File schreiben.
    (neben bei, was ich oben geschrieben habe betreffend einem Texteditierprogramm:
    dieses list ja auch das ganze File ein bevor ich es mutieren kann!)

    Thanks to all
    Rolf


Anmelden zum Antworten