PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ordner auslesen



localhost
11-08-2005, 18:13
Wie kann ich den einen Ordner auslesen?
So das man die Dateinamen bekomme, die sich in dem Ordenr befinden.

Gruss localhost

tybalt0125
11-08-2005, 18:32
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?

localhost
12-08-2005, 08:34
c++ wer nicht sclecht wenn das ging.

michael.sprick
12-08-2005, 10:55
das geht z.B. so:


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

anda_skoa
12-08-2005, 12:45
<iostream>

nicht


<iostream.h>


Letzteres ist ein veralteter Header und wird von aktuellen Compilern oft nicht mehr mitgeliefert. Der andere ist der Standard C++ Header.

Ciao,
_

Joghurt
12-08-2005, 16:05
Dann allerdings das
using namespace std; nicht vergessen, oder immer std::cout, std::endl schreiben.

localhost
15-08-2005, 13:35
Dann allerdings das
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

Joghurt
15-08-2005, 13:59
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ß.

localhost
16-08-2005, 11:14
#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

Joghurt
16-08-2005, 14:00
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

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
string name = entry->d_name;
if (name != "." or name != "..") { cout << name << endl;}

michael.sprick
16-08-2005, 14:48
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...


while(entry = readdir(dir))
{
if( strcmp(entry->d_name,".") && strcmp(entry->d_name,"..") )
cout << entry->d_name << endl;
}


oder auch


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 ;)

Joghurt
16-08-2005, 14:54
Hast recht, war nicht ganz bei der Sache. C++ hat aber auch das Schlüsselwort "and", also "or" einfach durch and ersetzen.

michael.sprick
16-08-2005, 15:03
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 ;)

Joghurt
16-08-2005, 15:08
Ich geb's auf! Heute ist einfach nicht mein Tag :cool:

anda_skoa
16-08-2005, 15:43
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



if (strcmp(a, b) == 0)

obwohl man im diskutiertem Falle wahrscheinlich strncmp benutzen würde ;)

Ciao,
_

localhost
16-08-2005, 18:34
Und find() dan auch so also

strcmp(entry->d_name).find() oder so ??

michael.sprick
16-08-2005, 18:51
nope - d_name ist kein string Objekt sondern ein 0-terminiertes charakter Array... das hat keine Methoden ;)
Da müsstest Du ersten einen String draus machen -> siehe weiter oben im Thread...


@anda_skoa: Ja, das klingt gut. Sollte ich mir auch angewohnen. Ich mag Code am liebsten, wenn man ihn wie Buch lesen kann. Daher stören mich solche Konstrukte immer ungemein. Bisher habe ich mir dann einfach eine Funktion geschrieben - in diesem Fall hätte ich sie vermutlich 'equal()' genannt oder so... 5 Minuten an einer Bedingung rumzudenken um die Logik zu verstehen ist nicht gut ;)