Hallo Matze!
Mangels Ahnung von Cpp suche ich noch in Tutorials. Mir fehlt für den
fstream eine Funktion zum Zurücksetzen von Zugriffsfehlern. Deinen o.g.
Code habe ich unter CodeBlocks als Cpp-Konsolen-Anwendung kompiliert. Im
Programm wird die Datei geschrieben, kann aber nicht gelesen werden, da
sie ja durch den 1. Zugriff im Schreibmodus ist.
Die Datei muß geschlossen und im Lesemodus wieder geöffnet werden. Da in
fstream ziel("Datei.txt") keine ios-Parameter als Dateimodus angegeben
sind, muß die Datei schon existieren. Sonst gibt es einen Fehler. Hier
sind Anweisungen für fstream ziel, das Programm läuft bei mir fehlerfrei
mit Ausnahme der while-Schleife zum Datei-Lesen:
#define s_fname "C:/Datei1.txt" // voller Pfad zum Wiederfinden
fstream ziel; // Deklaration des Datei-Stream "ziel"
ziel.open(s_fname, ios::out); // Erzeugt und öffnet eine neue Datei im
Schreibmodus. Eine schon vorhandene Datei wird dabei gelöscht!
ziel.open(s_fname, ios:out|ios::app); // Öffnet eine vorhandene Datei im
Schreibmodus zwecks Anfügen von Text. Dateizeiger wird an das Datei-Ende
gesetzt. Existiert die Datei nicht, so wird sie neu erzeugt.
ziel.open(s_fname, ios::in); // Öffnet eine schon vorhandene Datei im
Lesemodus. Wenn die Datei nicht existiert, tritt ein Zugriffsfehler auf.
ziel.close(); // Datei schließen. Der Stream bleibt aber bestehen.
fstream ziel(s_fname, ios-Parameter); // Deklariert Datei-Stream ziel
und öffnet die Datei im durch den/die Parameter angegebenen Modus.
Mehrfache Parameter können kombiniert werden und sind dabei durch das
OR-Zeichen (|) zu trennen. Außer den Parametern in o.g. Anweisungen gibt
es weitere.
Sobald bei einer dieser Anweisungen ein Zugriffsfehler auftritt, werden
weitere Zugriffe auf den Stream "ziel" gesperrt. Um Fehler zu prüfen,
habe ich hinter den Zugriffen eine Fehlerabfrage eingefügt. Etwa so:
if (!ziel) { cout<<"Fehler in Zeile xyz"<<endl; goto Fortsetzung; }
Direkt hinter while (ziel>>word) {...} bzw. nachdem der Text bis zum
Ende aus der Datei gelesen wurde, tritt ein Zugriff-Fehler auf. Ich
vermute vorsichtig, daß der Fehler durch Lesen über das Datei-Ende (EOF)
hinaus auftritt, wodurch das Lesen beendet wird.
File-Seek-Befehle habe ich weggelassen. Ich konnte mir den Zweck nicht
erklären. Das Programm hat ja trotzdem soweit funktioniert.
Wenn ein Stream wegen Fehler gesperrt ist, kann man mit einem weiteren
Stream die Datei wieder verarbeiten. Aber das löst das Problem nicht.
Der Sache mit "atei" bin ich nicht auf die Schliche gekommen. Bei mir
wird der Text korrekt angezeigt. Vllt. fällt mir dazu noch was ein.
Übrigends: wenn man nach fstream ziel("Datei.txt"), also ohne die ios-
Parameter, einen Text in die Datei schreibt, dann wird schon vorhandener
Text nicht gelöscht, sondern beginnend am Dateianfang überschrieben.
LG