Dateien im Ordner per dirent.h öffnet nur eine Datei


  • 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