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ßen2 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...??
-
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::appangegeben, 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::fstreambenutzen, musst dann aberstd::ios::outangeben.Ü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
-
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 ZeileGrüssli
-
Neue ZeileNeue ZeileNeue Zeile
wieso auch immer. mit deinem quellcode
-
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.

-
drakon schrieb:
Oder er hat einen Texteditor, der \n ignoriert..

Wenn man
std::endlund zudem erst recht noch keinstd::binaryverwendet, dann wird jedes\ndurch 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ß