Positionszeiger in einer Datei ans Ende + eine Zeile
-
Ok, danke, hätt ich auch selber drauf kommen können :o
Hab aber nen Problem mit dem Code:std :: fstream Data; .... char tempStr[255]; Data.getline(tempStr,255); if (tempStr[0] != '\0') { Data.seekp(0,std::ios::end); Data << "\n"; } .... std :: cin.getline(tempStr,255); Data << tempStr; ... Data.seekp(0); Data.clear();Hab das eingebaut, damit auch in der ersten Zeile der Datei geschreiben wird, nur leider klappt das irgendwie nicht. Wenn schon etwas in der Datei steht (die if-Anweisung also ausgeführt wird) gehts ohne Probleme. Wenn die Datei aber leer ist wird nichts geschreiben obwohl die Schreibanweisungen ausgeführt werden.
Ich denke, dass es nur am Positionszeiger liegen kann, aber das ist doch eigentlich unlogisch, da ich diesen gar nicht verändere und den am Ende der Funktion wieder auf 0 setzte, sodass ich beim nächsten aufruf keine Probleme haben sollte.
-
Wo wird die Schreibanweisung denn ausgeführt? Die steht doch nur in dem
if(tempStr[0]!='\0')...Block - und wenn das vorherige getline() nichts einlesen konnte, ist tempStr[0]=='\0' und der Block wird übersprungen.(außerdem: getline() auf einer leeren Datei setzt das eofbit und failbit - bevor du die Datei wieder sinnvoll verwenden kannst, mußt du die erstmal zurücksetzen)
-
CStoll schrieb:
Wo wird die Schreibanweisung denn ausgeführt? Die steht doch nur in dem
if(tempStr[0]!='\0')...Block - und wenn das vorherige getline() nichts einlesen konnte, ist tempStr[0]=='\0' und der Block wird übersprungen.zum code:
std :: cin.getline(tempStr,255); //Wird vorher geleert Data << tempStr; //Hier ist die Schreibanweisung in der DateiCStoll schrieb:
(außerdem: getline() auf einer leeren Datei setzt das eofbit und failbit - bevor du die Datei wieder sinnvoll verwenden kannst, mußt du die erstmal zurücksetzen)
Ein clear() bringt hier nichts, da dann das zuvor eingelesene '\n' wieder weg ist.
Könnte ich nicht z.B. auch die Größe der Datei auslesen und dementsprechend handeln? (wenn die Datei leer ist, ist diese ja = 0Byte). Problem dabei wäre nur, wenn die erste ein Leerzeichen bzw. Zeilenumbruch oder so enthält, ist die Datwei > 0 Byte.
Also wäre sowas wie oben vielleicht schon besser, oder wie sieht der gängige Weg bei soetwas aus?
-
ich kapier nicht was du haben willst ... du guckst ob dein 1. Zeichen deines Strings ein Terminierungszeichen ist ... wofür?
Sag mal lieber was du erreichen willst mit deinem Code ... soll der gucken ob die Zeile davor leer ist? und wenn ja kein '\n' in die Datei schreiben ... und sonnst schon?
-
Der Code soll am Ende der Datei + eine Zeile etwas schreiben, aber wenn die Datei komplett leer ist, natürlich bei der ersten Zeile anfangen zu schreiben.
Hier mal ein Bespiel://Datei ist leerNun wird geschrieben:
Hall du da!Nun wird die Schreibprozedur erneut aufgerufen, nachdem schon einiges mit der Datei gemacht wurde (z.B. etwas wurde ausgelesen)
Hall du da! //Hier soll nun hingeschrieben werdenErgebnis der Datei am Ende:
Hallo du da! LLALALALADas Problem ist, dass die Datei wärhend das Programm läuft die ganze Zeit offen ist und in der Zeit, je nach dem was der USer will, unterschiedliches mit dieser Gemacht wird. Ich könnt bei einer Schreibanweisung wie oben eigentlich die Datei schließen und wieder mit std::ios::app öffnen, sodass die an das Ende der Datei geschrieben wird. Aber da weiss ich nicht ob dies unbedingt günstig ist und ob es dort keinen einfacheren Weg gibt, darum die Frage
-
Normal müsste eof gesetzt sein wenn die Datei komplett leer ist
Und wenn nur leerzeichen drin sind ... wirds etwas aufwendiger 
-
naja das mit den Leerzeichen wird demnach was der User eingibt nicht gehen bzw. dass kann ich an dem Punkt abfangen zudem: wenn ich dem User sage wie er das einzugeben hat und er es nicht tut isses sein Pech oder?^^
Meinst du mit eof() sollte gesetzte sein mit eof() == true, sodass ich ne einfache if-anweisung bauen kann?
btw: wie soll ich ans Ende der Datei kommen? So wie ich das oben gebaut hatte?
-
nein ... also bin mir nicht sicher ob es geht ... aber probier es mal aus ob es geht mit folgendem:
std::ofstream file_stream("file.test", std::ios::out); if (file_stream.is_open() == false || file_stream.good() == false) return false; if (file_stream.eof() == false) { file_stream.seekg(0, std::ios::end); file_stream << "\n"; // std::endl; ... } std::string string_input; std::getline(std::cin, string_input); file_stream << string_input; // Data.seekp(0); /* was soll das bewirken? /* An den Anfang kämst du mit: /* file_stream.seekg(0, std::ios::beg); */ // Data.clear(); /* wofür? */ file_stream.close();
-
(D)Evil schrieb:
nein ... also bin mir nicht sicher ob es geht ... aber probier es mal aus ob es geht mit folgendem:
if (file_stream.eof() == false) { file_stream.seekg(0, std::ios::end); file_stream << "\n"; // std::endl; ... }In die erste Zeile wird nicht geschrieben... hab das mit std::endl; angepasst
(D)Evil schrieb:
// Data.seekp(0); /* was soll das bewirken? /* An den Anfang kämst du mit: /* file_stream.seekg(0, std::ios::beg); */ // Data.clear(); /* wofür? */ file_stream.close();Muss man clear() nicht anwenden, wenn man eof() ausgeführt hat? Hab ich so gelesen, da sonst der Datenstream nicht mehr zu gebrauchen wäre. Aber von der Position her richtig dumm wie mir gerade auffällt o.O
-
So, ich habs nun geschafft :p
Das Problem ist[gewesen], dass die Funktion eof() nicht auf true steht, wenn die Datei leer ist.
Bin dann wieder zu meinem alten Code zurückgekehrt, der eigentlich doch genauso funktionieren sollte oder? Denn immer wenn ein '\0' in einem String vorkomm der String zu ende ist. Wenn die erste Zeile der Datei aber leer ist ist das erste Zeichen ja = '\0'. Und wenn z.B. erst ab dem 4. Zeichen in der zeile der Datei der string beginnt, so sind die vorangegangenen Zeichen alle = " " oder?
Also hier der Code:char tempStr[255]; Data.getline(tempStr,255); Data.clear(); //Muss hier, da der Datenstrom wenn der String leer ist nicht zu gebrauchen ist if (tempStr[0] != '\0') { Data.seekp(0,std::ios::end); Data << "\n"; } ClearString(tempStr); //leert den String wieder