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.log

    Welche 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.


  • Mod

    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.


  • Mod

    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 absoluten den 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).txt

    Als Argument übergebe ich beispielsweise:
    C:\MyProjects\build-demle-Dektop_Qt_5_3_MinGW64-Debug\debug\logz

    Wenn 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 an argv[1] dranhängen ... mit slash dazwischen wenns geht bitte ...



  • Swordfish schrieb:

    Du sollst bitte dir_ent->d_name an argv[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. 🤡


Anmelden zum Antworten