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 Discussion :

Rechercher un fichier sur le disque (Linux)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué Avatar de Savak
    Homme Profil pro
    Ingénieur Etude et Développement
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Etude et Développement

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 192
    Points
    192
    Par défaut Rechercher un fichier sur le disque (Linux)
    Bonjour à tous!

    Dans le cadre de mes études, mon prof nous a demandé de réalisé un projet en C. Ce projet est divisé en plusieurs exercices et chaque exercice doit aboutir sur un programme plus où moins liés entre eux.

    Le premier est le suivant :

    A l'aide de la bibliothèque ncurses (cf ncurses(3)), créer 3 fenêtres pavant la fenêtre de terminal courante, et positionnées comme :



    Mettre un bord à chaque, et activer le défilement de texte pour chacune d'elle.
    Faire un programme p1 qui lit des chaines de caractères entrées au clavier depuis la fenêtre inférieure et qui
    les réécrits alternativement dans les fenêtres supérieures gauche et droite, jusqu'à ce qu'une chaine vide soit entrée.
    Vérifier que tout ce qui a été alloué par le programme soit bien correctement restitué.


    Jusque là, pas de problème, voici mon code :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdio.h>
    #include <ncurses.h>
    #include <stdlib.h>
     
    int main ()
    {	
    	char chaine [255];	
    	int maxX;
    	int maxY;
     
    	initscr (); // Initialisation de Curses
     
    	refresh (); // Mise à jour de l'affichage
     
    	getmaxyx(stdscr, maxY, maxX);
     
    	WINDOW * winGauche = newwin(maxY/2, maxX/2, 0, 0); // Création de la fenêtre win1
    	WINDOW * winDroite = newwin(maxY/2, maxX/2, 0, maxX/2); 
    	WINDOW * winBas = newwin(maxY/2, maxX, maxY/2, 0);  
     
    	WINDOW * derwinGauche = derwin(winGauche, maxY/2-2, maxX/2-2, 1, 1); // Création de la sous-fenêtre derwin1 de win1
    	WINDOW * derwinDroite = derwin(winDroite, maxY/2-2, maxX/2-2, 1, 1); 
    	WINDOW * derwinBas = derwin(winBas, maxY/2-2, maxX-2, 1, 1); 
     
    	scrollok(derwinGauche, TRUE);
    	scrollok(derwinDroite, TRUE);
    	scrollok(derwinBas, TRUE);
     
    	box(winGauche, ACS_VLINE, ACS_HLINE); // Dessine la boîte winGauche
    	box(winDroite, ACS_VLINE, ACS_HLINE); 
    	box(winBas, ACS_VLINE, ACS_HLINE); 
     
    	wrefresh (winGauche); // Affiche le fenêtre winGauche
    	wrefresh (winDroite); 
    	wrefresh (winBas); 
    	wrefresh (derwinGauche); // Affiche la sous-fenêtre derwinGauche
    	wrefresh (derwinDroite); 
    	wrefresh (derwinBas); 
     
    	do {
     
    		wgetstr(derwinBas, chaine); // Saisi de la chaine par l'utilisateur dans la sous-fenêtre du bas
     
    		waddstr(derwinGauche, chaine); // La chaine saisie précédemment est réécrite dans la sous-fenètre en haut à gauche
    		waddstr(derwinGauche, "\n");
     
    		wrefresh(derwinGauche);
     
    		waddstr(derwinDroite, chaine); // La chaine saisie précédemment est réécrite dans la sous-fenètre en haut à droite
    		waddstr(derwinDroite, "\n");
     
    		wrefresh(derwinDroite);
     
    		wrefresh (derwinBas);
     
    	} while (chaine[0] != '\0');
     
    	delwin(winGauche); //libère la mémoire de la fenêtre winGauche
    	delwin(winDroite);
    	delwin(winBas);
    	delwin(derwinGauche); //libère la mémoire de la sous-fenêtre derwinGauche
    	delwin(derwinDroite);
    	delwin(derwinBas);
     
    	endwin (); // Fin de Curses
     
    	return (0);
    }
    Vient ensuite l'exercice suivant :

    Faire un programme p2 qui lit des noms de fichier dans la fenêtre inférieure, et pour chacun d'eux,
    recherche les fichiers correspondant sur le disque, affiche les noms complets des fichiers trouvés dans la fenêtre
    supérieure gauche, et le nombre de fichiers trouvés dans la fenêtre supérieure droite.


    Et là, c'est la débandade!

    J'ai essayé de travailler avec le fichier d'en-tête dirent.h mais sans parvenir à mes fins...

    Je viens donc vers vous pour vous poser la question suivante : est-ce que "dirent" est adapté à mon problème et je m'y prends comme un manche ou bien, existe-t-il un autre moyen faire le programme demandé?

    D'après la FAQ C de Developpez.com, "dirent" devrait pouvoir faire ce que l'énoncé de l'exercice me demande mais je n'y arrive pas et je préfère venir vous voir maintenant plutôt que de perdre davantage de temps si jamais ce n'est pas le bon fichier d’en-tête à utiliser...

    Merci d'avance pour vos conseil!

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Oui dirent va t'aider à lister !

    opendir, readdir, closedir pour lister le contenu d'un dossier....

    Et stat pour différencier les fichiers des dossiers !

    Tout ça c'est du man 2 (appels systèmes)... bon courage !


    PS : Si ton prof te l'autorise, essaye de voir s'il n'est pas possible d'utiliser le programme "locate" pour chercher dans un catalogue automatiquement rempli par le système.... ça va EXTREMEMENT plus vite qu'une recherche manuelle....
    Mais le but de l'exo est "probablement" d'implémenter une recherche manuelle avec les 4 syscalls décrits plus haut.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par Metalman Voir le message
    les 4 syscalls décrits plus haut.
    Une petite rectification, opendir, readdir et closedir sont des fonctions de la bibliothèque standard C (libc, man 3), pas des appels système.

    @Savak Je te conseille de regarder aussi du côté de ftw.
    ɹǝsn *sıɹɐlos*

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    @Savak Je te conseille de regarder aussi du côté de ftw.
    Petite remarque après avoir suivi ton lien, je lis :
    POSIX.1-2008 marque ftw() comme étant obsolète
    Je présume qu'il faut donc se "contenter" de nftw().

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Oui, nftw est aujourd'hui recommandé et l'exemple de la page de manuel don't j'ai posté le lien l'utilise.

    Avec ftw il y a un risque de fuite mémoire si la fonction appelée par ftw est interrompue et sort par un longjmp.
    ɹǝsn *sıɹɐlos*

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Savak Voir le message
    Jusque là, pas de problème, voici mon code...
    Salut
    J'aime bien ton code. Il est bien construit, des noms de variables clairs, des commentaires. Bref un travail soigné et plaisant à relire.
    Citation Envoyé par Savak Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		waddstr(derwinGauche, chaine); // La chaine saisie précédemment est réécrite dans la sous-fenètre en haut à gauche
    		waddstr(derwinGauche, "\n");
     
    		wrefresh(derwinGauche);
     
    		waddstr(derwinDroite, chaine); // La chaine saisie précédemment est réécrite dans la sous-fenètre en haut à droite
    		waddstr(derwinDroite, "\n");
     
    		wrefresh(derwinDroite);
    Toutefois, ici si je le lis bien, la chaine saisie est écrite à la fois en fenêtre gauche et en fenêtre droite. Or, l'énoncé parle d'écriture alternative. C'est à dire (pour moi) que si tu saisis "toto" il ira s'écrire à gauche puis ensuite tu saisis "titi" et lui ira s'écrire à droite.

    De plus, si tu utilisais un tableau pour gérer tes deux fenêtres tu pourrais éviter pas mal de duplication d'instructions. Je pense que ce genre de détail compte aussi pour ton prof (en tout cas ça compterait pour moi...)

    Sinon pour ton soucis oui, c'est bien opendir+readdir qu'il te faut utiliser. Et pense aussi à gérer les fichiers "." et ".."...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre habitué Avatar de Savak
    Homme Profil pro
    Ingénieur Etude et Développement
    Inscrit en
    Avril 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur Etude et Développement

    Informations forums :
    Inscription : Avril 2012
    Messages : 111
    Points : 192
    Points
    192
    Par défaut
    Bon j'ai fais au mieux avec mon binôme et le résultat est relativement concluant

    Je vous poste le code dès que j'aurais davantage de temps afin que je puisse vous expliquer ce que j'ai fait.

    Merci à tous les deux pour vos conseil!

Discussions similaires

  1. [VB.NET] Comment rechercher des fichiers sur un disque.
    Par vijeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/08/2017, 10h17
  2. [Toutes versions] Recherche de fichiers sur le disque
    Par ZeitnotZatopek dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 22/10/2009, 12h52
  3. Comment rechercher un fichier sur le disque ?
    Par SOPSOU dans le forum Langage
    Réponses: 5
    Dernier message: 10/12/2007, 13h30
  4. Rechercher un fichier sur le disque dur et le sup.
    Par Kysers95 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/09/2007, 00h38
  5. Réponses: 3
    Dernier message: 16/11/2006, 11h54

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