Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » alle files mit gewisser extension öffnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.10.2005, 12:03 Uhr
oli_f



Hallo,

ich möchte mittels einer Schleife (also nacheinander) alle Dateien öffnen, die eine gewisse Endung haben (bspw. *.f7) und sich in dem gewünschten Verzeichnis befinden. Jede dieser Dateien soll dann halt mit fstream f(file,ios::in) usw. verfügbar sein.

In Perl kenne ich das einfach mit

Code:
while (<*.f1>)
{
  open(DATA, $_);

  bla bla
}


aber so was habe ich für C++ noch nicht gefunden...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.10.2005, 12:30 Uhr
virtual
Sexiest Bit alive
(Operator)


Im unterschied zu Perl kennt Standard C++ zwei Dinge nicht:
1. Patterns/Globs
2. Verzeichnisse

Für beide Dinge mußt Du auf systemspezifische Lösungen zurückgreifen, welche davon abh., ob Du unter Windows oder einem Betriebssytem arbeitest.
Den ersten Punkt, nämluch Patterns, brauchst Du bei dieser Aufgabe nicht, denn das geht natürlich auch phne RegExes.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.10.2005, 12:37 Uhr
oli_f




Zitat:

ob Du unter Windows oder einem Betriebssytem arbeitest


soll damit angedeutet werden, dass Windows kein richtiges Betriebssystem ist ;-)
Aber nee, ich arbeite unter Linux. Debian Sarge genau genommen, aber die Distro ist ja egal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.10.2005, 12:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich denke er meinte "oder einem anderen Betriebsystem" (freud lässt grüßen )
--
class God : public ChuckNorris { };

Dieser Post wurde am 04.10.2005 um 12:49 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.10.2005, 14:01 Uhr
Pablo
Supertux
(Operator)


Naja, mit C/C++ kannst du leider keine Patterns angeben, da musst du etwas mit strncmp zaubern oder so. Für das Einlesen von Verzeichnise und Dateien stehen dir folgende Funktionen zur Verfügung:

struct dirent *readdir(DIR *dir); (brauchst dafür sys/types.h und dirent.h)
int lstat(const char *path, struct stat *buf); (sys/types.h, sys/stat.h, unistd.h)

und so geht es:


C++:
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

int dirlist_r(const char* path, size_t indent)
{
    DIR* directory;
    struct dirent* dirInfo;
    struct stat attr;
    struct stat* attributes = &attr;
    size_t i;

    char[1024] filename, print_indent;
    char* statname;

    if(!path or indent > 1024) return 0;

    /* finde heraus, ob angegebener Pfad auch Verzeichnis ist */

    if(lstat(path, attributes)==0)
    {
         if(!S_ISDIR(attributes->st_mode)) {
              fprintf(stderr, "%s is not a directory\n", path);
              return 0;
         }
    } else return 0;

    *print_indent = 0;
    for(i=0; i<indent; ++i)
        strcat(print_indent, " ");

    directory = opendir(path);

    if(!directory)
    {
         printf("cannot open directory\n");
         return 1;
    } else printf("\n");

    while( (dirInfo = readdir(directory)) )
    {
         /* generate whole path */
         i = dir[strlen(dir) - 1] == '/' ? 0 : 1;

         statname = malloc(strlen(dir) + 1 + i + strlen(dirInfo->d_name));

         if(!statname)
         {
              fprintf(stderr, "You don't have enough memory\n");
              return 0;
         }

         *statname = 0;

         strcat(statname, dir);
         strcat(statname, i ? "/" : "");
         strcat(statname, dirInfo->d_name);

         /* read file attributes with lstat. If fails, then ignore file/dir */
         if(lstat(statname, attributes)==0)
         {
             if(S_ISDIR(attributes->st_mode))
             {

                  /* make a recursiv search, but ignore
                                 *      .
                                 *      ..
                  */


                   if( strcmp(dirInfo->d_name, ".") &&
                                    strcmp(dirInfo->d_name, ".."))
                   {
                        printf("%s%s (dir) -->", print_indent, path);
                        dirlist_r(statname, indent + 4);
                   }
             } else printf("%s%s (file)\n", print_indent, dirInfo->d_name);
         }
         free(statname);
    }

    return 1;
}



ich hab's on the fly gemacht, hoffe, hab keinen Fehler gemacht. Diese Funktion liefert den Verzeichnisbaum + Dateien (rekursiv) eines Verzeichnises.

( --> )
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 04.10.2005 um 14:01 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.10.2005, 15:43 Uhr
oli_f



jeez, hatte gehoffte, es würde eine elegante - sprich: einfache und kurze Lösung geben. Aber ich werde es mir anschauen...
Vielen Dank!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.10.2005, 18:18 Uhr
Pablo
Supertux
(Operator)



Zitat von oli_f:
jeez, hatte gehoffte, es würde eine elegante - sprich: einfache und kurze Lösung geben. Aber ich werde es mir anschauen...
Vielen Dank!


wenn ich eine einfachere Lösung kennen würde, hätte ich die gepostet. Ich denke, es gibt keine fertige Funktionen dafür.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.10.2005, 11:34 Uhr
virtual
Sexiest Bit alive
(Operator)


glob
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.10.2005, 11:40 Uhr
Pablo
Supertux
(Operator)


cool... sowas hatte ich noch nie gesehen.
Ich hätte doch die gesamten man pages durchsuchen müssen
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.10.2005, 11:45 Uhr
virtual
Sexiest Bit alive
(Operator)


@Pablo
oder Perl lernen: da heißt das nämlich globbing und man hat schon mal einen netten Anhaltspunkt, wonach man überhaupt sucht
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: