Dateien im Ordner per dirent.h öffnet nur eine Datei
-
Hi,
ich habe einen Ordner mit vielen zu prüfenden Dateien. Z.B.:
file1.log
file2.log
file3.log
file4.log
file5.logWelche ich mittels:
if ((dir = opendir (dirPath)) != NULL) { /* print all the files and directories within directory */ while ((ent = readdir (dir)) != NULL) { if ( *(ent->d_name) == 0x2E ) continue; // skip ./ und ../ processDatei(ent->d_name); }
Dazu habe ich in ein den Ordner eine zu Parsende Datei kopiert und n-mal manuell eingefügt. In der processDatei() werden dann die eingelesenen Dateien mittels:
processDatei(const char * inname) { std::ifstream in; in.open(inname, std::ios_base::in); if ( in.fail() ) { std::cerr << "Eingabedatei '" << inname << "' fehlerhaft!" ; return; } //.. }
wo die originale Datei korrekt eingelesen wird. Die, die ich selbst per Copy&Paste eingefügt habe fallen per fail() durch. Warum? Mit dem Hexeditor verglichen ist der exakte Inhalt wie in der originalen Datei!?!?!?
Ich danke für konstruktive Hinweise und VG
Lespaul
-
file1.log Ist die originale, welche korrekt bearbeitet wird. Bei den anderen greift dann fail()
Eingabedatei 'file2.log' fehlerhaft!
Eingabedatei 'file3.log' fehlerhaft!
Eingabedatei 'file4.log' fehlerhaft!Keine Datei ist leer, und im Hexeditor identisch.
-
Auf welchem Betriebssystem programmierst du? Könnte es evtl. ein Rechteproblem sein?
Statt auf fail() würde ich einfach auf
if (!in)
testen.
PS: Und auf open() kannst du auch verzichten, indem du direkt den Konstruktor dafür benutzt:
std::ifstream in(inname);
Und statt 0x2E würde ich eher '.' schreiben...
-
Th69 schrieb:
Und statt 0x2E würde ich eher '.' schreiben...
Nene, das ist nicht h4x0r-l337!!
Mein Tip: Arbeitsverzeichnis.
-
Vollständiges Minimalbeispiel.
-
Guten Morgen,
Th69 schrieb:
Auf welchem Betriebssystem programmierst du? Könnte es evtl. ein Rechteproblem sein?
Win 7 Pro, Besitzer alle ich.
Th69 schrieb:
PS: Und auf open() kannst du auch verzichten, indem du direkt den Konstruktor dafür benutzt:
std::string outname(outPath); //.. std::ifstream infstream( outname.data() );
C:\MyProjects\demle\main.cpp:74: Fehler: variable 'std::ifstream infstream' has initializer but incomplete type
std::ifstream infstream( outname.data() ); Der Parameter muss doch char * sein?
-
Swordfish schrieb:
Mein Tip: Arbeitsverzeichnis.
Zum debuggen hab ich die Ordner im debug/ Ordner erstellt, wo die *.o und *.exe reinkommen. Später werden diese selbstverständlich ausgelagert.
-
lespaul schrieb:
C:\MyProjects\demle\main.cpp:74: Fehler: variable 'std::ifstream infstream' has initializer but incomplete type
include fstream vergessen?
std::ifstream infstream( outname.data() ); Der Parameter muss doch char * sein?
1. .data() ist doch ein const char *, was auch erwartet wird. Aber richtig wäre .c_str(), da eine nullterminierte Zeichenkette erwartet wird, was data nicht unbedingt ist.
2. Ab C++11 geht auch direkt string. Solltest du nutzen.
-
SeppJ schrieb:
Vollständiges Minimalbeispiel.
Hier ein kompilierbares Minimalbeispiel:
#include <fstream> #include <iostream> #include <dirent.h> int main(int argc, char* argv[]) { char* dirPath = argv[1]; DIR *dir; struct dirent *dir_ent; dir = opendir(dirPath); if (dir != NULL) { while ((dir_ent = readdir (dir)) != NULL) { char * infname = dir_ent->d_name; if ( *infname == 0x2E ) continue; std::string inname(infname); // std::ifstream infstream( inname, std::ios_base::in ); std::ifstream infstream( inname.c_str() ); if ( !infstream ) { std::cerr << "Eingabedatei '" << inname << "' fehlerhaft!" << std::endl; return -1; } // Ausgabe einzelner Zeilen aus Datei std::string line; while (std::getline(infstream, line)) { std::cout << "Line " << line; } infstream.close(); } closedir (dir); } else { std::cout << "Abbruch kein Ordner: " << dirPath << " !" << std::endl ; return -1; } return 0; }
-
lespaul schrieb:
kompilierbares Minimalbeispiel
lol, der war gut.
Wie wärs wenn du zuerst
einen absolutenden richtigen Pfadtm zusammenbastelst bevor du versuchst die Datei zu öffnen?Swordfish schrieb:
Mein Tip: Arbeitsverzeichnis.
Yay. What do i win?
// btw dirent.h tut gut auf !posix.
-
lespaul schrieb:
Hier ein kompilierbares Minimalbeispiel:
Erstellt mit dem QtCreator --> das Buildverzsichnis : C:\MyProjects\build-demle-Dektop_Qt_5_3_MinGW64-Debug\debug\
Dort habe ich einen Ordner "logz" erstellt und dort eine Textfile (tt.txt) reingepackt. Diese habe ich nun kopiert und vier (4) weitere Mael eingefügt. Also befinden sich dort nun:
tt.txt
tt (2).txt
tt (3).txt
tt (4).txt
tt (5).txtAls Argument übergebe ich beispielsweise:
C:\MyProjects\build-demle-Dektop_Qt_5_3_MinGW64-Debug\debug\logzWenn man nun das " return -1;" aus Zeile 26 entfernt, wird folgendes ausgegeben:
Eingabedatei 'tt (2).txt' fehlerhaft!
Eingabedatei 'tt (3).txt' fehlerhaft!
Eingabedatei 'tt (4).txt' fehlerhaft!
Eingabedatei 'tt (5).txt' fehlerhaft!
Eingabedatei 'tt.txt' fehlerhaft!
-
lespaul schrieb:
kompilierbares Minimalbeispiel
<string>
fehlt.Sonst: Ja? und?
Du sollst bitte
dir_ent->d_name
anargv[1]
dranhängen ... mit slash dazwischen wenns geht bitte ...
-
Swordfish schrieb:
Du sollst bitte
dir_ent->d_name
anargv[1]
dranhängen ... mit slash dazwischen wenns geht bitte ...Daran lag es! Da die Dateinamen aufgelistet wurden, bin ich nicht drauf gekommen, dass der Pfad fehlen könnte
-
Swordfish schrieb:
Swordfish schrieb:
Mein Tip: Arbeitsverzeichnis.
Yay. What do i win?
so!? nothing i guess -hmpf-
-
Das gesamte Forum schenkt dir Bewunderung und Anerkennung!
Reicht das?
-
Swordfish schrieb:
Swordfish schrieb:
Swordfish schrieb:
Mein Tip: Arbeitsverzeichnis.
Yay. What do i win?
so!? nothing i guess -hmpf-
Um ehrlich zu sein, als !(h4x0r-l33t) habe ich das auch folgerichtig gar nicht verstanden worum es bei dieser aussage geht. Um das Forum nicht zuzuspammen, ließ ich das unkommentiert.