2 kleine Problem mit textdatei erzeugen und schreiben



  • Hallo,
    ich habe folgenden Code:

    FILE* document; // Zeiger auf Datenstrom der Datei
        if (1)
        {
          document = fopen(".\\test.txt","w"); // Dokument neu erzeugen
        }
        else
        {
          document = fopen(".\\test.txt","a"); // Dokument öffnen, Text anhängen
        };
        fprintf(document, Zeit);
        fprintf(document, ":");
        fprintf(document, Kennung);
        fprintf(document, "->");
        fprintf(document, Status);
        fprintf(document, ":");
        fprintf(document, Text);
        fclose(document); // Datei schließen
    

    2 kleine Probleme hab ich jetzt noch.

    1. wie kann ich überprüfen, ob die datei bereits existiert? das müsste ich noch bei "if (1)" ersetzen
    2. er würde jetzt den eintrag, wenn die textdatei schon besteht hinter den ersten eintrag schreiben. der eintrag sollte aber in die nächste zeile.

    gruß und ich hoffe ich nerve net mit meinen vielen fragen 😃



  • Erstens: Öffnen im Append-Modus "a" funktioniert auch, wenn die Datei noch nicht existiert.

    Zweitens: Schreib doch am Ende des Datensatzes einen Zeilenwechsel "\n", dann hast du eine neue Zeile für den nächsten Datensatz. (btw könntest du die vielen kleinen fprintf()-Aufrufe auch zu einem großen zusammenfassen)

    PS: Wir sind hier im C++ Board, also bitte verwende std::fstream.



  • std::ofstream file_stream("test.txt");
    file_stream << time << ":" << id << "->" << state << ":" << string;
    

    und feddisch 😛



  • ok, jetzt habe ich es so:

    std::fstream Datei (".\\test.txt", ios::out);
      Datei << Zeit << ":" << Kennung << "->" << Status << ":" << Text << "\n";
      Datei.close();
    

    jetzt muss ich nur noch sagen, wenn schon vorhanden, nicht überschreiben, sondern anhängen..

    hat jemand einen tip?



  • codeman2001 schrieb:

    ok, jetzt habe ich es so:

    std::fstream Datei (".\\test.txt", ios::out);
      Datei << Zeit << ":" << Kennung << "->" << Status << ":" << Text << "\n";
      Datei.close();
    

    jetzt muss ich nur noch sagen, wenn schon vorhanden, nicht überschreiben, sondern anhängen..

    hat jemand einen tip?

    habs schon gefunden...

    std::fstream Datei (".\\test.txt", ios::app);
      Datei << Zeit << ":" << Kennung << "->" << Status << ":" << Text << "\n";
      Datei.close();
    


  • int main()
    {
        std::ofstream file_stream("test.txt", std::ios::app);
        file_stream << time << ":" << id << "->" << state << ":" << string;	
    }
    


  • danek für eure mithilfe!!! 😃



  • hab leider damals irgendwie die dokumentation des quelltextes gelöscht.
    jetzt muss ich das ganze ein wenig ändern und alles neu schreiben...

    kann mir einer sagen, wieso das hier nicht mehr funktioniert?
    IDE: netbeans, compiler:cygwin

    #include <fstream.h>
    #include <iostream.h>    
    .
    .
    .
    //Erstellung bzw. Änderung der .txt Datei
        std::fstream Datei ("test.txt", ios::app);
        Datei << Zeit << ":" << Text << "\n";
        Datei.close();
    .
    .
    .
    

    Die Datei wird weder erstellt, noch wird ein eintrag in der (testweise) vorhandenen Datei gemacht. OS ist Vista.

    gruß



  • Probiers mal mit ofstream..

    std::ofstream Datei ("test.txt", ios::app);
        Datei << Zeit << ":" << Text << "\n";
        Datei.close();
    

    Bist du sicher, dass du Schreibrecht hast?



  • sicher bin ich mir mit dem schreibrecht nicht, ist ja vista 😃
    hab aber eigentlich admin rechte



  • also ofstream funzt, jedoch hängt er den eintrag immer hinten an und fängt nicht in der neuen zeile an, wie er es sollte...??


  • Administrator

    codeman2001 schrieb:

    also ofstream funzt, jedoch hängt er den eintrag immer hinten an und fängt nicht in der neuen zeile an, wie er es sollte...??

    Du hast ja auch std::ios::app angegeben, was so viel heisst, dass er die Sache hinten anfügen soll. Und du hast ja auch selber gesagt, dass du dies willst:

    codeman2001 schrieb:

    jetzt muss ich nur noch sagen, wenn schon vorhanden, nicht überschreiben, sondern anhängen..

    Was meinst du mit einer neuen Zeile?

    Du kannst übrigens auch std::fstream benutzen, musst dann aber std::ios::out angeben.

    Übrigens, was für einen seltsamen Kompiler hast du? Mir ist es ein Rätsel, wie ein heute aktueller Kompiler sowas kompiliert:

    #include <fstream.h> 
    #include <iostream.h>
    

    Das ist nicht Standard C++, richtig wäre:

    #include <fstream> 
    #include <iostream>
    

    Grüssli



  • hi,
    hab jetzt das .h weg gemacht 😉

    Also ich möchte das jeder eintrag in eine neue zeile gepackt wird. egal ob mit ofstream oder mit fstream 😉

    also jedes mal, wenn die prozedur ausgeführt wird, wird ein eintrag in eine neue zeile der txt datei gepackt. der alte eintrag bleibt aber bestehen..
    wenn ich das auf ::out setze löscht er immer den alten eintrag und schreibt nur den neuen rein, dass soll aber nicht der fall sein.
    verstehst du was ich meine?

    gruß und danke schon einmal


  • Administrator

    Ah, ok. Aber dann sollte das funktionieren:

    #include <fstream>
    
    int main()
    {
      std::ofstream file("./text.txt", std::fstream::app | std::fstream::out);
      file << "Neue Zeile" << std::endl; // std::endl, gibt neue Zeile aus und flusht den Stream.
      file.close();
    
      return 0;
    }
    

    Wenn ich dieses kleine Programm 5 mal ausführe, dann erhalte ich diese text.txt Datei:

    Neue Zeile
    Neue Zeile
    Neue Zeile
    Neue Zeile
    Neue Zeile
    

    Grüssli



  • Neue ZeileNeue ZeileNeue Zeile

    wieso auch immer. mit deinem quellcode


  • Administrator

    Was verwendest du denn als Kompiler und Standardbibliothek? Kann es mir fast nicht anders erklären, als das dort ein Bug drin ist.

    Grüssli



  • Dravere schrieb:

    Was verwendest du denn als Kompiler und Standardbibliothek? Kann es mir fast nicht anders erklären, als das dort ein Bug drin ist.

    Grüssli

    Oder er hat einen Texteditor, der \n ignoriert.. 😉



  • Was auch immer du verwendest, ein Wechsel zu Code::Blocks oder Microsoft Visual C++ 2008 Express ist zu empfehlen. 🙂


  • Administrator

    drakon schrieb:

    Oder er hat einen Texteditor, der \n ignoriert.. 😉

    Wenn man std::endl und zudem erst recht noch kein std::binary verwendet, dann wird jedes \n durch die OS-Spezifische Form ersetzt. Also dürfte kein Problem darstellen, ausser sein Texteditor ignoriert alles 🙂

    Grüssli



  • hallo,
    ich benutzen den standard editor von vista.
    wie schon einmal gesagt benutze ich netbeans als ider und cygwin als kompiler (http://www.cygwin.com - bin ich durch die fh drauf gekommen...)

    naja, habe das prog damals mitm borland geschrieben und da funzte das auch. liegt vielleicht wirklich am compiler.

    werds die tage mal mit microsoft visual studio probieren. vielleicht klappt es da ja wieder.

    erst einmal besten dank für eure hilfe. ich gebe die tage nochmal rückmeldung ;9

    gruß


Anmelden zum Antworten