c++ verzeichnisse einlesen

Diskutiere c++ verzeichnisse einlesen im Developer Network Forum im Bereich Hardware & Software Forum; wie kann ich in c++ verzeichnise einlesen/scannen, bzw die inhalte.(nur die namen der dateien). mit opendir(), readdir() une scandir() komme ich...
  • c++ verzeichnisse einlesen Beitrag #1
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
wie kann ich in c++ verzeichnise einlesen/scannen, bzw die inhalte.(nur die namen der dateien).
mit opendir(), readdir() une scandir() komme ich nicht so zurecht, also bitte nicht auf die manpages verweisen.
ein bischen code wären ideal.
thx

CU
 
  • c++ verzeichnisse einlesen Beitrag #2
O

O Love

Bekanntes Mitglied
Dabei seit
08.04.1999
Beiträge
2.286
Reaktionspunkte
0
Hier ein paar Auszüge aus der BC 3.1 Hilfe...
Code:
 ?________________________________¦
 ? _dos_findfirst, _dos_findnext, ¦   <DOS.H>
 ? findfirst, und findnext        ¦   <DIR.H>
 ?________________________________¦

  _ _dos_findfirst und findfirst durchsuchen ein Verzeichnis nach Dateien
  _ _dos_findnext und findnext führen die Suche fort

 Definition:
  _ unsigned _dos_findfirst(const char *pathname, int attrib,
      struct find_t *ffblk);
  _ unsigned _dos_findnext(struct find_t *ffblk);
  _ int findfirst(const char *pathname, struct ffblk *ffblk, int attrib);
  _ int findnext(struct ffblk *ffblk);

 Hinweis:
_dos_findfirst und findfirst verwenden den DOS-System-Aufruf 0x4E, um ein
Verzeichnis nach dem ersten Auftreten eines Dateieintrags zu durchsuchen.

_dos_findnext und findnext suchen anschließend Dateien, die mit dem Argument
pathname von _dos_findfirst und findfirst übereinstimmen.

  Argument ¦ Funktion        ¦ Funktion/Auswirkung
 ----------?-----------------?----------------------------------------------
  pathname ¦ _dos_findfirst, ¦ Ein String mit optionaler Laufwerksangabe und
           ¦ findfirst       ¦ den zu suchenden Dateinamen. Der Dateiname
           ¦                 ¦ kann Platzhalter (? und *) enthalten.
 ----------+-----------------+----------------------------------------------
  ffblk    ¦ findfirst,      ¦ Zeigt auf die ffblk-Struktur mit der
           ¦ findnext        ¦ Datei- und Verzeichnis-Information, wenn
           ¦                 ¦ findfirst oder findnext eine Datei, die der
           ¦                 ¦ in pathname angegebenen entspricht, findet.
           ¦                 ¦
  ffblk    ¦ _dos_findfirst, ¦ Zeigt auf die find_t-Struktur mit der
           ¦ _dos_findnext   ¦ Datei- und Verzeichnis-Information, wenn
           ¦                 ¦ _dos_findfirst oder _dos_findnext eine Datei,
           ¦                 ¦ die der in pathname angegebenen entspricht
           ¦                 ¦ findet.
 ----------+-----------------+----------------------------------------------
  attrib   ¦ _dos_findfirst, ¦ DOS-Datei-Attribut-Byte (definiertin DOS.H)
           ¦ findfirst       ¦

Bei jedem Aufruf von _dos_findnext oder findnext wird ein Dateiname
geliefert, bis in dem in pathname angegebenen Verzeichnis keine Dateien mehr
gefunden werden.
und...
Code:
  ffblk                                    <DIR.H>
 _______
DOS-FCB-Struktur.

  struct ffblk {
    char ff_reserved[21]; /* von DOS reserviert */
    char ff_attrib;       /* gefundenes Attribut */
    int  ff_ftime;        /* Datei-Zeit */
    int  ff_fdate;        /* Datei-Datum */
    long ff_fsize;        /* Datei-Größe */
    char ff_name[13];     /* gefundener Datei-Name */
  };

 Bedeutung:
ff_ftime und ff_fdate sind 16-Bit-Strukturen die in Bitfelder aufgeteilt
sind, die sich auf das aktuelle Datum und die Zeit beziehen.

 ff_ftime ¦15.....11¦10........5¦4.......0¦
 ________ ¦-?-?-?-?-+-?-?-?-?-?-+-?-?-?-?-¦
          +-¤-¤-¤-¤---¤-¤-¤-¤-¤---¤-¤-¤-¤-+
            Stunden    Minuten   Sekunden/2

 ff_fdate ¦15..........9¦8.....5¦4.......0¦
 ________ ¦-?-?-?-?-?-?-+-?-?-?-+-?-?-?-?-¦
          +-¤-¤-¤-¤-¤-¤---¤-¤-¤---¤-¤-¤-¤-+
            Jahre seit    Monat     Tag
               1980

Die Struktur dieser Felder wurde von DOS geprägt.
und...
Code:
  find_t                              <DOS.H>
 ________

Struktur des DOS-FCB (Datei-Steuerblock), die von
_dos_findfirst und _dos_findnext benutzt.

Die Struktur find_t entspricht exakt der Struktur ffblk.

  struct find_t {
    char     reserved[21];   /* für Microsoft reserviert - nicht ändern */
    char     attrib;         /* Attribut-Byte für entsprechende Datei */
    unsigned wr_time;        /* Zeit des letzten Schreibvorgangs  */
    unsigned wr_date;        /* Datum des letzten Schreibvorgangs */
    long     size;           /* Dateigröße   */
    char     name[13];       /* ASCII-Name der übereinstimmenden Datei */
  };
und...
Code:
  FA_xxxx                             <DOS.H>
 _________

Dateiattribute von MS-DOS.

  Konstante ¦ Beschreibung
 -----------?---------------------
  FA_RDONLY ¦ Schreibschutz
  FA_HIDDEN ¦ verborgene Datei
  FA_SYSTEM ¦ Systemdatei
  FA_LABEL  ¦ Volume-Label
  FA_DIREC  ¦ Verzeichnis
  FA_ARCH   ¦ Archivdatei

Weitere Informationen entnehmen Sie bitt Ihrer MS-DOS-Dokumentation.
O Love
 
  • c++ verzeichnisse einlesen Beitrag #3
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Jetzt kann man nur hoffen, dass mezzo mix auch unter Windows entwickelt und nicht auf einem Unix-System arbeitet;) .

Falls Du unter Unix/Linux arbeitest, probiers mal hiermit als Einstieg:

Code:
#include <sys/types.h>
#include <dirent.h>
 
int main(int argc, char **argv)
{
  DIR *myDir;
  char *dirName="./";
  struct dirent *entry;
 
  if (argc==2)
    dirName=argv[1];
  
  if (!(myDir=opendir(dirName))) {
    fprintf("Verzeichnis kann nicht geoeffnet werden\n");
    exit(1);
  } 
  while (entry=readdir(myDir)) {
    printf("Eintrag: %s\n",entry->d_name);
  }
  closedir(myDir);
}
Nic
 
  • c++ verzeichnisse einlesen Beitrag #4
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
Originally posted by O Love

Weitere Informationen entnehmen Sie bitt Ihrer MS-DOS-Dokumentation.

O Love
:p
nic_power hat es schon richtig vermutet.

danke dir trotzdem o love für die mühe, die du dir gemacht hast.

@nic deinen code probier ich gleich mal aus.
thx

CU
 
  • c++ verzeichnisse einlesen Beitrag #5
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
wie mach ich denn ein String array?
hab zu lange mit anderen sprachen verbracht, und sehr viel c vergessen.

ich will die einzelnen dateinamen in ein String array schreiben.
ich weis aber nicht wie man ein solches array erzeugt.
so wie bei integers geht es ja wohl nicht:
String dateien [laenge]

vielleicht kann mir da noch jemand helfen?

CU

@nic genau so ein programm hab ich gesucht. danke.
 
  • c++ verzeichnisse einlesen Beitrag #6
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Da wirds dann schon etwas komplizierter, da Du Anfangs nicht weisst, wieviele Eintraege ein Verzeichnis hat, wuerde ich eine verkettete Liste nehmen. Die simpelste Moeglichkeit ist ein
char *Array fester Laenge:

Code:
#include <sys/types.h>
#include <dirent.h>
#define MAXENTRY 1024
 
int main(int argc, char **argv)
{
  DIR *myDir;
  char *dirName="./";
  struct dirent *entry;
  char *dirNames[MAXENTRY];
  int i=0, k;
 
  if (argc==2)
    dirName=argv[1];
 
  if (!(myDir=opendir(dirName))) {
    fprintf("Verzeichnis kann nicht geoeffnet werden\n");
    exit(1);
  } 
  while (entry=readdir(myDir)) {
    dirNames[i++]=strdup(entry->d_name);
  }
  closedir(myDir);
  for (k=0; k<i; k++)
    printf("name = %s\n",dirNames[k]);
}
Achtung, den Code habe ich nicht ausprobiert. Auf keinen Fall darfst Du mehr als MAXENTRY Eintraege in einem Verzeichnis haben (am Besten mitzaehlen). Besser ist sicherlich eine verkettete Liste.
Code:
struct dirEntry_s {
  char *name;
  struct dirEntry_s *next;
};   /* Datentyp für Verzeichnis */

[....]

Für jeden Verzeichniseintrag musst Du dann ein Element erzeugen, den Namen in die Struktur kopieren und die Pointer auf das naechste Element setzen. Das ist mehr Aufwand, aber wesentlich flexibler.

Nic
 
  • c++ verzeichnisse einlesen Beitrag #7
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
danke ersmal, das hat mir sehr geholfen.
weist du vielleicht noch wie ich mit fprintf die ausgabe auf einen device aus /dev/ umleiten kann?

CU
 
  • c++ verzeichnisse einlesen Beitrag #8
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Du musst das Device vorher mit fopen oeffnen:

Code:
  FILE *myFile;

  if (!(myFile=fopen("/dev/device", "r+"))) {
    fprintf(stderr,"cant open device\n");
    exit(1);
  }
  fprintf(myFile,"%s\"n, "hallo");

Bei einem Device wuerde ich aber besser mit "open" und "write" arbeiten.

Code:
  int fd
  char *message="hallo\n";

  if ((fd=open("/dev/device",O_RDWR))==-1) {
    fprintf(....);
  }
  write(fd,message, strlen(message));

Je nach Device, musst Du eventuell noch etwas an den Flags (O_RDWR) aendern.


Nic
 
  • c++ verzeichnisse einlesen Beitrag #9
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
danke

CU
 
  • c++ verzeichnisse einlesen Beitrag #10
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
so, hoffentlich die letzte frage:

es soll nun ein programm im hintergrund gestartet werden, welches als parameter einen eintrag des/r arrays/liste erhält.

aus der man page von exec werde ich nicht richtig schlau.

ich will den process anschließend aber auch abschießen können.
vielleicht hast du da auch noch eine idee/antwort.
thx

CU
 
  • c++ verzeichnisse einlesen Beitrag #11
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

Dafuer gibts fork und exec

Code:
  int pid;

  if ((pid=fork())<0) {
    perror("fork");   /* fork fehlgeschlagen */
    exit(1);
  } else if (pid==0) {
    execl("/mein/program","program", dirNames[0], (char *)NULL);
    perror("exec"); /* wird nur dann ausgefuehrt, wenn execl fehl schlaegt */
    exit(1);
  } else {
    /* vater prozess, kann beispielsweise mit "wait" aufs "Kind" warten */
  }

fork erzeugt eine Kopie des laufenden Prozesses, mit execl wird im Kind-Prozess (also der Kopie) das angegebene Programm ausgefuehrt, im Beispiel oben mit dem ersten Verzeichnisnamen als Parameter. Der Vaterprozess kann gegebenenfalls mit "wait" auf den Kindprozess warten.

Nic

Nic
 
  • c++ verzeichnisse einlesen Beitrag #12
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
vielen dank nic, das hat mir alles sehr geholfen.

nun die glaub' ich (hoff' ich) letzte frage.
(hat nix mehr so richtig was mit den verzeichnissen zu tun, aber ich hatte deine letzte antwort auch noch nicht gewürdigt.)

ich möchte, wenn der benutzer des programms eine gewisse zeit keine eingabe tätigt, daß dann eine funktion gestartet wird.
irgendwie hab' ich was über cbreak gelesen, damit sollte das wohl funktionieren. ich krieg' aber nicht hin.
auch sowas wie kbhit() habe ich nicht gefunden.(gibt's wohl unter winc++).
weißt du/ihr weiter.

CU
 
  • c++ verzeichnisse einlesen Beitrag #13
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

cbreak() ist eine Funktion aus der curses Bibliothek zur Ansteuerung von ASCII-Terminals. Ich wuerde setitimer und einen Signal-Handler verwenden:

Code:
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

void mySignalHandler(int value)
{
  printf("Zeit ist um!\n");
  exit(1);
}

int main(int argc, char **argv)
{
  struct itimerval myTime;

  bzero(&myTime,sizeof(myTime));
  myTime.it_value.tv_sec=10;
  myTime.it_value.tv_usec=0;

  signal(SIGALRM, mySignalHandler);
  setitimer(ITIMER_REAL, &myTime, NULL);
  while (1) {
    sleep(1);
    printf("warte auf eingabe\n");
  }
}

Nic
 
  • c++ verzeichnisse einlesen Beitrag #14
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
danke!
 
  • c++ verzeichnisse einlesen Beitrag #15
mezzo mix

mezzo mix

Bekanntes Mitglied
Dabei seit
24.12.2000
Beiträge
1.793
Reaktionspunkte
1
Ort
Entenhausen
hab' gerade mal ein bischen rumprobiert.
das ist noch nicht so ganz das was ich brauche, ich bekomme das irgendwie nicht hin.
habe mich glaube ich aber auch nicht so klar ausgedrückt.

der benutzer gibt das wärend das programm läuft zahlen(1stellig) ein.
bisjetzt habe ich das mit cin gemacht, daß ist aber nicht ganz das was ich brauche, denn die zahl soll ohne enter direkt geholt werden. (brauch ich dafür nicht cbreak, oder geht das auch anders?)
wenn der benutzer nun eine gewisse zeit nix eingegen hat soll eine fkt gestartet werden.
nun soll aber auch wenn der benutzer was eingegeben hat dieser timer zurückgesetzt werden.
die funktion die gestartet wird gibt nur eine meldung aus.
danach sollen weitere eingaben folgen, und das spielchen immer so weiter gehen.

hast du da vielleicht noch was für mich?

CU
 
  • c++ verzeichnisse einlesen Beitrag #16
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
sowas in der Art?

Code:
#include <curses.h>
#include <signal.h>
#include <stdio.h>
#include <sys/time.h>
 
static struct itimerval myTime;
 
static void restartSignalHandler(int mySignal)
{
  addstr("Zeit ist um!\n");
  myTime.it_value.tv_sec=10;
  myTime.it_value.tv_usec=0;
  signal(SIGALRM, restartSignalHandler);     /* neu starten*/
  setitimer(ITIMER_REAL, &myTime, NULL);
}
 
static void cleanCurses(int mySignal)
{
  endwin();
  exit(1);
}
 
int main(int argc, char **argv)
{
  int c;
 
  bzero(&myTime,sizeof(myTime));
  myTime.it_value.tv_sec=10;
  myTime.it_value.tv_usec=0;
 
  signal(SIGINT, cleanCurses);           /* sigint raeumt auf */
  signal(SIGALRM, restartSignalHandler); /* zeit ist um */
  initscr();                             /* curses initialisieren */
  keypad(stdscr, TRUE);                  /* keyboard mapping einschalten */
  cbreak();                              /* nicht auf return warten */
 
  setitimer(ITIMER_REAL, &myTime, NULL);
  for (;; ) {
    c=getch();                           /* eingabe (ein zeichen) einlesen */
    [.... zeichen verarbeiten ....]
    setitimer(ITIMER_REAL, &myTime, NULL);
  }
}

Wenn keine Taste gedrueckt wird, erscheint alle 10 Sekunden die Meldung, dass die Zeit um ist. "CTRL-C" terminiert das Program und "raeumt auf". Falls die Eingabe aus mehr als einem Zeichen besteht, musst Du Dir noch einen string zusammenbauen.

Nic
 
Thema:

c++ verzeichnisse einlesen

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben