IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

findfirst et findnext [Débutant]


Sujet :

C++Builder

  1. #1
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 767
    Par défaut findfirst et findnext
    Bonjour,
    Quoique vieux routard en C, je suis confronté dans l'urgence à la compilation d'une partie de mes sources en ++. Problème ici: Le findfisrt donne bien un résultat 0, mais le findnext suivant fournit un résultat -1. De plus, l'affichage écran est abberrant. Ma source est toujours en C, le passage en ++ se fera plus tard. Merci de m'aider.
    Edgar.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <dir.h>
    #include <stdio.h>
     
    #pragma warn -par
    void main(int argc,char *argv[])
    {
    struct ffblk f;
    int done;
    long totfiles=0L,totsize=0L;
     
    done=findfirst("*.*",&f,0x3f);
    while(!done) {
        printf("%s %ld",f.ff_name,f.ff_fsize);
        if(*f.ff_name=='.') printf(" dir");
        printf("\x0d\x0a");
        totfiles++; totsize+=f.ff_fsize;
        done=findnext(&f);
        }
    findclose(&f);
    printf("%ld fichiers, %ld bytes\n",totfiles,totsize);
    }
    #pragma warn .par
     
     
    /* ----------------------------------------------------------------------------
    Dans dir.h (Borland C++builder6), on trouve:
     
    struct  ffblk   {
        long            ff_reserved;
        long            ff_fsize;
        unsigned long   ff_attrib;
        unsigned short  ff_ftime;
        unsigned short  ff_fdate;
        char            ff_name[MAXPATH];
    };
     
    int         _RTLENTRYF _EXPFUNC     findfirst( const char _FAR *__path,
                                        struct ffblk _FAR *__ffblk,
                                        int __attrib );
    int         _RTLENTRYF _EXPFUNC     findnext( struct ffblk _FAR *__ffblk );
    int         _RTLENTRYF _EXPFUNC     findclose( struct ffblk _FAR *__ffblk );
    ---------------------------------------------------------------------------- */
     
    /* ----------------------------------------------------------------------------
    Résultats compilation & link: (effectués sous dos)
    C:\Program Files\Borland\CBuilder6\src>bcc32 -WCR -K mydir.c 
    Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
    mydir.C:
    Turbo Incremental Link 5.60 Copyright (c) 1997-2002 Borland
    ---------------------------------------------------------------------------- */
     
    /* ----------------------------------------------------------------------------
    Sortie écran du programme: (effectués sous dos)
     65535 -->parfois aussi 0
     
    1 fichiers, 65535 bytes
    ---------------------------------------------------------------------------- */

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut,
    C++ Builder ne peut pas créer des applications DOS
    par contre on peut créer des applications consoles

    Da ns ton code le paramètre attrib pose un problème (0x3F) suivant l'OS
    il est préférable d'utiliser une combination des attributs

    code fonctionnel ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    struct ffblk f;
      int done;
      long totfiles=0L,totsize=0L;
      done = findfirst(dir_name, &f, FA_NORMAL|FA_DIREC|FA_ARCH);
     
      /* Scan all files that mach */
      while (!done)
      {
     
    	if(f.ff_attrib&FA_DIREC) printf("%s [dir]",f.ff_name);
    	else
    	printf("%s %ld",f.ff_name,f.ff_fsize);
    	printf("\x0d\x0a");
    	totfiles++; totsize+=f.ff_fsize;
    	done = findnext(&f);
      }
     
      /* Close the find handle */
      findclose(&f);
    cdlt
    Images attachées Images attachées  
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 767
    Par défaut
    Hello,
    Désolé pour le retard.

    Citation Envoyé par DjmSoftware Voir le message
    Dans ton code le paramètre attrib pose un problème (0x3F) suivant l'OS
    il est préférable d'utiliser une combination des attributs
    J'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void main(int argc,char *argv[])
    {
    struct ffblk f;
    int done;
    long totfiles=0L,totsize=0L;
     
    done=findfirst("*.*",&f,FA_RDONLY|FA_NORMAL|FA_HIDDEN|FA_SYSTEM|FA_LABEL|FA_DIREC|FA_ARCH);
    while(!done) {
    	printf("%s %ld",f.ff_name,f.ff_fsize);
    	if(*f.ff_name=='.') printf(" dir");
    	printf("\n");
    	totfiles++; totsize+=f.ff_fsize;
    	done=findnext(&f);
    	}
    findclose(&f);
    printf("%ld fichiers, %ld bytes\n",totfiles,totsize);
    }
    Hélas, toujours le même résultat. Cela peut-il venir de la commande de compilation? Celle que j'utilise:
    bcc32 -WCR -K %1.c

    Merci en tout cas pour l'aide.
    Edgar.

  4. #4
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    a tu essayé de compiler et linker ton fichier depuis l'EDI(C++ Builder)
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 767
    Par défaut
    Hello,
    Non, je n'ai pas essayé. C'est une connaissance qui m'a dit utiliser bcc32. Je ne sais d'ailleurs pas comment faire: je viens de charger ma source (File, Open) e assayé F9,F8,F7, mais l'edi (borland c++ builder 6 entreprise) travaille toujours sur un projet! Impossible de trouver un compiler/linker quelquepart.

  6. #6
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Je t'ai déja donné une réponse
    Menu : Fichier|nouveau|Autre|Expert Console
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 767
    Par défaut
    Hello,
    Excuse-moi, je n'avais pas saisi.
    Bon, c'est fait, résultat identique. C'est à n'y rien comprendre. Le programme ne se plante pas, j'ai invariablement le résultat "1 fichiers, (nbr aléatoire) bytes"
    Après plusieurs run, on dirait que findfirst() n'initialise pas la structure f, et qu'on pointe dans les étoiles!
    Généré avec tcc/tlink et exécuté, résultat correct.
    Je remets ma source finale, tu peux peut-être la tester chez toi?
    Quoi qu'il en soit, merci pour ton aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <dir.h>
    #include <dos.h>                /* Pour #define FA_  */
    #include <stdio.h>
     
    #pragma warn -par
    void main(int argc,char *argv[])
    {
    struct ffblk f;
    int done;
    long totfiles=0L,totsize=0L;
     
    done=findfirst("*.*",&f,FA_RDONLY|FA_NORMAL|FA_HIDDEN|FA_SYSTEM|FA_LABEL|FA_DIREC|FA_ARCH);
    while(!done) {
    	printf("%s %ld",f.ff_name,f.ff_fsize);
    	if(f.ff_attrib&FA_DIREC!=0) printf(" dir");
    	printf("\n");
    	totfiles++; totsize+=f.ff_fsize;
    	done=findnext(&f);
    	}
    findclose(&f);
    printf("%ld fichiers, %ld bytes\n",totfiles,totsize);
    }
    #pragma warn .par

  8. #8
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    as tu essayé le code que j'ai posté
    il est parfaitemnent fonctionel
    il me semble qu'il y a u problème avec
    avec les filtres

    d'autre part je te conseille d'utiliser les fonctions de l'API win 32
    FindFirstFile,FindNextFile,FileClose

    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  9. #9
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 767
    Par défaut
    Hello,
    Tu a mis le doigt dessus. Après 20 petites minutes de test, en rajoutant les attributs les uns après les autres, c'est FA_LABEL qui envoie findfirst() dans les étoiles. Tous les autres, seuls ou associés, donnent le résultat attendu. Je vais enfin pouvoir avancer!
    Concernant les API Win32, je les emploie depuis le debut puisque les tailles déclarées sont différentes entre dos et win.
    Un grand merci à toi.
    Cordialement,
    Edgar.

  10. #10
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2015
    Messages : 19
    Par défaut Lire plusieurs fichier.txt d'un repertoir sous Builder c++
    Salut ,
    SVP quelqu'un a une idée comment lire plusieurs fichiers.txt d'un repertoir sous Builder c++ ... please help

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. FindFirst et FindNext avec accents
    Par joce21 dans le forum Langage
    Réponses: 16
    Dernier message: 19/01/2012, 15h52
  2. Plusieurs filtre dans FindFirst , FindNext
    Par 0x44-0x43-0x53-0x43 dans le forum Langage
    Réponses: 1
    Dernier message: 05/07/2010, 18h37
  3. FindNext et FindFirst
    Par adec62360 dans le forum Pascal
    Réponses: 1
    Dernier message: 21/05/2007, 19h09
  4. Comment je peux utiliser Findnext FindFirst
    Par zizo89 dans le forum Delphi
    Réponses: 5
    Dernier message: 17/05/2007, 16h19
  5. comment utiliser Findfirst et FindNext
    Par oumarsaw dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/04/2006, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo