Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Ordner auslesen

  1. #1
    Registrierter Benutzer
    Registriert seit
    07.11.2002
    Beiträge
    396

    Ordner auslesen

    Wie kann ich den einen Ordner auslesen?
    So das man die Dateinamen bekomme, die sich in dem Ordenr befinden.

    Gruss localhost

  2. #2
    Registrierter Benutzer
    Registriert seit
    15.07.2005
    Beiträge
    52
    Zitat Zitat von localhost
    Wie kann ich den einen Ordner auslesen?
    So das man die Dateinamen bekomme, die sich in dem Ordenr befinden.

    Gruss localhost
    Womit?
    Ich meine mit welcher Sprache möchtest du das machen?

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.11.2002
    Beiträge
    396
    c++ wer nicht sclecht wenn das ging.

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    das geht z.B. so:

    Code:
    #include <iostream.h>
    #include <dirent.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
      char *dirname = ".";
      DIR *dir;
      struct dirent *entry;
    
      if(argc == 2)
      {
        dirname = argv[1];
      }
    
      if(dir=opendir(dirname))
      {
        while(entry = readdir(dir))
        {
          cout << entry->d_name << endl;
        }
        closedir(dir);
      }
    
      return(0);
    }


    schau Dir dazu auch

    man readdir
    man opendir
    man closedir

    an. In diesem Beispiel wird entweder das aktuelle Verzeichnis oder, falls übergeben, argv[1] ausgelesen...

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Code:
    <iostream>
    nicht
    Code:
    <iostream.h>
    Letzteres ist ein veralteter Header und wird von aktuellen Compilern oft nicht mehr mitgeliefert. Der andere ist der Standard C++ Header.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Dann allerdings das
    Code:
    using namespace std;
    nicht vergessen, oder immer std::cout, std::endl schreiben.

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.11.2002
    Beiträge
    396
    Zitat Zitat von Joghurt
    Dann allerdings das
    Code:
    using namespace std;
    nicht vergessen, oder immer std::cout, std::endl schreiben.

    was hatt das eindlich mit dem std:: auf sich
    ich mach das eindlich nur wen ich dan denke bei string also std::string alshdlashl

  8. #8
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Namespace. Früher war cout ja dann vergeben, und du konntest keine Methode/Variable problemlos cout nennen, jetzt hat jede Bibliothek ihren eigenen Namespace, man braucht die Klassen also z.B. nicht "LibFoobarHTMLParser" nennen, sondern kann einfach "HTMLParser" im Namensraum "FooBar" definieren, ohne sich Sorgen machen zu müssen, dass dieser Name bereits vergeben ist. Und die Standardlibraries haben halt den Namespace "std" zugewiesen bekommen.

    Sieh dir mal die Boost-Libraries an, da wird der Sinn schnell klar
    http://www.boost.org <- sollte man als C++-Programmierer sowieso kennen, damit macht das Programmieren und C++ wieder Spaß.

  9. #9
    Registrierter Benutzer
    Registriert seit
    07.11.2002
    Beiträge
    396
    Code:
    #include <iostream>
    #include <dirent.h>
    #include <unistd.h>
    
    using namespace std;
    int main(int argc, char *argv[])
    {
      char *dirname = ".";
      DIR *dir;
      struct dirent *entry;
    
      if(argc == 2)
      {
        dirname = argv[1];
      }
    
      if(dir=opendir(dirname))
      {
        while(entry = readdir(dir))
        {
          if(entry->d_name != "." or entry->d_name != "..")
          cout << entry->d_name << endl;
        }
        closedir(dir);
      }
    
      return(0);
    }
    wenn ich das so machen will geht nicht also den . und .. nict anzeigen lassen will.
    und wenn ich nur entry holle kommt eine hexa zahl bei raus.
    Und find geht auch nicht also
    entry.find()
    entry->d_name.find()
    geht auch nicht

  10. #10
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von localhost
    Code:
    if(entry->d_name != "." or entry->d_name != "..")
    Damit vergleichst du, ob entry->d_name auf die selbe Speicheradresse wie "." zeigt, was du willst, geht mit strcmp
    Code:
    if (!strcmp(entry->d_name,".") or !strcmp(entry->d_name,".."))
    beachte die Negation, da strcmp 0 zurückgibt, wenn die Strings identisch sind.

    Alternativ kannst du den char* natürlich auch in einen String umwandeln
    Code:
    string name = entry->d_name;
    if (name != "." or name != "..") { cout << name << endl;}

  11. #11
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Code:
    if(!strcmp(entry->d_name,".") or !strcmp(entry->d_name,".."))
    Das geht so auch nicht ganz, denn wenn in entry->d_name ein "." steht, ist der erste Ausdruck aufgrund des ! true und damit wird . ausgegeben. Gleiches gilt für ".." - da wird der zweite ausdruck true und damit auch der GEsamtausdruck... .ist ja eine ODER Verknüpfung. Also wird hier NUR "." und ".." ausgeben.

    Der Inhalt von d_name soll nicht "." UND nicht ".." sein

    Es gibt verschiedene Möglichkeiten das zu erreichen...
    Code:
    while(entry = readdir(dir))
    {
      if( strcmp(entry->d_name,".") && strcmp(entry->d_name,"..") )
            cout << entry->d_name << endl;
    }
    oder auch
    Code:
    while(entry = readdir(dir))
    {
      if( !strcmp(entry->d_name,".") ||  strcmp(entry->d_name,"..") )
        continue;
      cout << entry->d_name << endl;
    }
    Ist ein bißchen verquer , wegen der Logik mit strcmp()... ich fall auch immer wieder drauf rein

  12. #12
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Hast recht, war nicht ganz bei der Sache. C++ hat aber auch das Schlüsselwort "and", also "or" einfach durch and ersetzen.

  13. #13
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    also "or" einfach durch and ersetzen.
    Dann aber auch die Negierung von strcmp() raus... sonst wird garnix ausgegeben...Ein String kann nicht gleichzeitig "." und ".." sein

  14. #14
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819

    Thumbs down

    Ich geb's auf! Heute ist einfach nicht mein Tag

  15. #15
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von michael.sprick
    Ist ein bißchen verquer , wegen der Logik mit strcmp()... ich fall auch immer wieder drauf rein
    Ich hab mir angewöhnt bei Funktionen die keinen echten boolschen Wert liefern, immer mit dem gewünschten Zielwert zu vergleichen.

    Also im Falle von strcmp

    Code:
    if (strcmp(a, b) == 0)
    obwohl man im diskutiertem Falle wahrscheinlich strncmp benutzen würde

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •