003
04.01.2007, 12:28 Uhr
Blubber2063
|
Zitat von BoBtheREapER: |
wenn du eine datei öffnest dann musst du sie auch schließen, das ist wie mit new und delete. wenn du eine datei zum schreiben öffnest dann darf kein anderes programm die datei zum schreiben öffnen bis du sie wieder geschloßen hast. mit stream.geline() kannst du eine einzelne zeile einlesen.
|
Das ist Unsinn, es gibt normalerweise keinen Filelock weil du nen Stream auf ne Datei öffnest, aber es ist z.B. bekannt das die Datei noch verwendet wird, weswegen sie nicht einfach gelöscht werden kann. Es kann sein das es auch Funktionen gibt die das exclusive belegen von Dateien erlauben, aber das ist kein Standarfall. Nebenbei stream.getline() liefert dir nur die Zeile bist dein übergebenes Arary voll ist. Besser std::getline(istream a, string b) Parameterreinfolge kann auch andersrum sein, schon ne Weile nicht mehr benutzt. Aber das liefert immer die ganze Zeile im std::string als Ergebnis.
1. mit new holt man sich dynamisch Speicher vom Betriebssystem und mit delete gibt man ihn wieder frei.
2. ifstream ist nur fürs Lesen da ist korrekt.
3. Du darfst das nicht so schreiben. Stream bezeichnet dein ifstream Objekt, also in deinem Fall müsstest du in.getline() schreiben, aber wie gesagt besser ist getline(in, <stringvariable>.
Dann noch zur Erklärung deines Problems wegen close und der ersten Zeile. Datein werden meist in Blockgröße geschrieben, d.h. das BS oder der C++ Stream, puffern deine Anforderung bis es sich lohnt zu schreiben. Um einen Schreibvorgang zu "erzwingen", muss man dann die Methode flush() aufrufen. Genau das passiert wenn du close() aufrufst. Erst wird flush() aufgerufen und jetzt die Datei geschlossen.
Solltest du vergessen haben eine Datei zu schließen, tut das Betriebssystem dies wenn das Programm endet. Damit man hier keine handle s mehr hat die übrig bleiben. Trotzdem sollte man besser seine Dateien selbst schließen, wenn man sie nicht mehr braucht. |