Probleme mit opendir



  • Hallo miteinander,

    hoffe die Frage ist hier richtig platziert. Ich bin C++-Newbie und nachdem ich stundenlang herumprobiert und -gesucht habe, mag ich nimmer und wende mich an erfahrene Leute - folgender Code soll mir schlicht den Inhalt eines Ordners ausgeben:

    DIR *hdir;
        struct dirent *entry;
    
        hdir = opendir(".");
        do
        {
            entry = readdir(hdir);
    
            if (entry) {
    	     printf("Dateiname %s\n", entry->d_name);
            }
        } while (entry);
        closedir(hdir);
    

    Ist weit verbreitet, ziemlich unspektakulär und funktioniert wunderbar, wenn ich ihn mit CodeBlocks kompiliere. Allerdings brauche ich den Code im Rahmen eines Programms namens Tscope, das ich von cygwin aus "bediene" da die wesentlichen Komponenten eben in letzterem installiert sind. Ich habe keine Ahnung davon, was da im Hintergrund abläuft, aber jedenfalls bekomme ich es über cygwin in der Datei, in der ich den Code benötige, nicht zum Laufen, bzw. bekomme diese Fehlausgabe.

    Er findet alle Dateien und Ordner im betreffenden Ordner (plus "." bzw. ".."), aber die Dateinamen werden nicht angezeigt - statt der Herzchen und Smilies sollten da eigentlich einige .txt, .c, .exe etc.-Dateien stehen. Ich habe über stat() versucht weitere Infos zu bekommen, aber die Ausgabe ist bei allen Dateien dieselbe (also st_size bei allen 0 etc.).

    Weiß jemand weiter/wie ich die normale Funktionalität des ganzen wiederherstellen kann?



  • Das ist kein Standard-C++, vermutlich nichtmal wirklich C++. Ich vermute mal dass es sich hier um UNIX oder etwas in der Art handelt, und um eine C-API.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Welche Version von cygwin benutzt du? Evtl liegt es daran, dass die Unicode-Funktionen von Windows intern verwendet werden. (Evtl. mal den Pfadnamen in hex ausgeben und gucken ob das hinkommen kann.)



  • Ahoi lagalopex,

    danke für die Antwort. Wenn

    uname -srv
    

    der richtige Weg ist, das herauszufinden, wäre das Version 1.5.24 (cygwin_nt-5.1 sagt's noch).

    Pfadangaben gibt es keine, er benutzt den Ordner der aufrufenden Datei, und er findet die korrekte Anzahl an Dateien in nämlichen Ordner (eine mehr, wenn ich eine hinzufüge etc.). Möglicherweise versteh ich aber ohnehin nicht, was du meinst, denn dass er keinen Pfad benutzt sieht man ja am opendir(".");, schätze ich.

    Also: Was meinst du mit

    lagalopex schrieb:

    Pfadnamen in hex ausgeben

    ? 🙂



  • In etwa so:

    DIR *hdir; 
    struct dirent *entry; 
    
    hdir = opendir("."); 
    
    while ((entry = readdir(hdir))) {
       int i;
    
       printf("Dateiname (len=%u):", strlen(entry->d_name));
    
       for (i = 0; i < strlen(entry->d_name); ++i)
          printf(" %x", entry->d_name[i]);
    
       printf("\n");
    }
    closedir(hdir);
    

    Btw, wird von codeblocks das selbe cygwin benutzt?



  • Danke für den Code. Resultat sieht so aus.

    lagalopex schrieb:

    Btw, wird von codeblocks das selbe cygwin benutzt?

    Hm in der Tat vermutlich nicht, bei der heutigen Installation gemäß des codeblocks-getting started hab ich den "GNU GCC compiler" ausgewählt 😕



  • Nur fürs Protokoll: Es hat tatsächlich den Eindruck, als würde Tscope ganz elementare Veränderungen im cygwin vornehmen, so dass auch ohne

    #include <tscope.h>
    

    keine "normale" C++-Funktionalität besteht.

    Ich kann nicht einmal iostream includen ohne dass er 100 Fehlermeldungen bringt. Das hatte ich nicht getestet, weil ich die Fehlfunktion nur auf den tscope-header zurückgeführt habe... jedenfalls macht es wohl so keinen Sinn, weiter opendir (bzw. readdir) ordentlich zum Laufen zu bringen zu wollen.

    Trotzdem vielen Dank, lagalopex 🙂


Anmelden zum Antworten