Dateien in einer while schleife via readdir + f.open auslesen
-
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <ctype.h> #include <string.h> #include <dirent.h> using namespace std; int main() { DIR *ptr; dirent *ptrx; size_t finden; fstream f; char nPfad[20]; char *Dateiname; string nDateiname = ""; string Endung = ".txt"; string GesammtPfad = ""; string Zeile = ""; string Wort = "Apfel"; string Pfad = "E:\\Woerter"; const char *Pfadptr; cin >> nPfad; ptr = opendir(nPfad); while(ptrx = readdir(ptr)) { Dateiname = ptrx->d_name; nDateiname = Dateiname; finden = nDateiname.find(Endung); if(finden != string::npos) { GesammtPfad = Pfad + "\\" + nDateiname; Pfadptr = GesammtPfad.c_str(); cout << Pfadptr << endl; f.open(Pfadptr, ios::in); getline(f, Zeile); cout << Zeile << endl; while(!f.eof()) { getline(f, Zeile); cout << Zeile << endl; } f.seekg(0); } } return 0; }So und mein output fenster zeigt mir das und ich weiß leider nicht warum

http://anthek.de/images-i3623bqjl8c.jpg
Wer nicht auf den link drücken will:
Es zeigt mir immer wieder (Zeile 44) das letzte Wort aus der ersten Datei an, weshalb meine darauf folgende while-schleife nicht anspringt weil die !eof-Bedingung nicht erfüllt ist.
Meine Frage ist wie ich das lösen kann damit es mir die Wörter aus den andern 2 Dateien anzeigt?
Falls was komplett falsch ist tuts mir Leid ich bin nicht so bewandert in diesem Bereich _
-
Der Stream ist nach dem eof noch im Fehlerzustand. Daher schlagen alle Leseaktionen fehl.
Technisch korrekte Antwort: Fehlerstatus mit clear aufheben
Hilfreiche Antwort: Filestreams nicht wiederverwenden. Macht fast nie Sinn. so auch hier. Einfach jeweils ein neues Streamobjekt in deiner Schleife erstellen.P.S.: Du scheinst zwar C++ machen zu wollen, programmierst aber in einem Stil, der selbst in C als alt gelten würde. Vermutlich schlechtes Lehrmaterial.
-
Vier Dinge:
1. Du schreibst hier kein C. Es ist weder notwendig noch sinnvoll, alle Variablen in einem großen Block am Funktionsanfang zu erstellen.
2. Wenn du ein fstream-Objekt wiederverwenden willst, musst du ggf. Fehlerzustände aufräumen - in diesem Fall eof. Das geht mit
f.clear();Hübscher wäre es aber, jedes mal ein neues ifstream-Objekt zu verwenden; damit hat man solche Sorgen erst gar nicht.
while(f.eof()) { std::getline(f, foo); ... }ist ein beliebter Anfängerfehler. Das EOF-Bit wird gesetzt, nachdem ein Leseversuch fehlgeschlagen ist, weil das Dateiende erreicht wurde. Auf diese Weise wird also die letzte Zeile zwei mal verarbeitet, weil zwischen dem Einlesen und dem Verarbeiten der eingelesenen Daten keine Prüfung auf EOF stattfindet. Richtig ist
while(std::getline(f, foo)) { ... }std:.getline gibt den übergebenen Eingabestrom zurück, und dessen operator void*() wird dann verwendet, um die Bedingung auszuwerten. Er ist NULL (false), wenn ein Fehlercode gesetzt ist.
4. GANZ WICHTIG!
char nPfad[20]; cin >> nPfad;ist brandgefährlich. Wenn dir jemand da mehr als 19 Zeichen eingibt, hast du böse verschissen, und du solltest dir solchen Unfug gar nicht erst angewöhnen. Nimm std::string, und wenn du dann mit einer C-Funktion sprechen musst, nimm dessen Methode c_str(), um einen C-String zu bekommen.
-
hab mein fehler selber gefunden musste einfach ein f.close nach beendigung der schleife hinzufügen, da ansonsten die erste Datei noch bestand hat.
Und danke für den tipp mit cin hab das schon umgeändert war nur zum testen
Trotzdem vielen Dank für die Antworten