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 :

Trouver une ligne dans un fichier d'adresses


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Par défaut Trouver une ligne dans un fichier d'adresses
    bonjour à tous

    dans le cadre d'un projet informatique je dois créer un programme en langage C.

    Je dispose d'un fichier rassemblant des centaines d'adresses de cartes de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ./BD-ORTHO-1998/67/67-1998-108/1998-0972-2454-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0973-2449-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0973-2450-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0973-2451-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0974-2449-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0974-2450-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0974-2451-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0975-2455-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0976-2449-67.txt
    ./BD-ORTHO-1998/67/67-1998-108/1998-0976-2450-67.txt
    ou 108 est le numéro de la carte et 0972-2454 (par exemple) les coordonnées d'un point de la carte.

    Le but de mon programme est que l'utilisateur rentre les coordonnées du point qu'il cherche et que le programme lui renvoie le numéro de carte correspondant à ce point. Je cherche donc quels sont les outils qui me permettront de retrouver la ligne correspondant aux coordonnées rentrées par l'utilisateur parmi les centaines d'adresses du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./BD-ORTHO-1998/67/67-1998-108/1998-0976-2449-67.txt
    contenues dans mon fichier


    quelle commande de manipulation de fichiers me permettrait de lire ces différentes informations?
    une commande type "fgetc" me permet de lire un caractere dans un fichier et me renvoie le nombre de fois que ce caractere apparait. Je chercherais plutot une commande qui me donnerais la ligne où se trouve l'information que l'utisateur aurait rentré (par exemple: 0976-2449)

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Tu peux lire ligne par ligne ton fichier avec fgets puis a chaque ligne lue tu regardes si la chaine recherchée s'y trouve avec strstr

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Par défaut
    mais comment utiliser cette fonction?

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par geok120
    mais comment utiliser cette fonction?
    Tu as lu sa doc ?

    http://man.developpez.com/

    Tu as fait quelques essais dans un 'snippet' ? Comme dit élégamment un des moniteurs de voiles de ma fille "il faut se tirer les doigts du cul"... Ben oui, ça ne va pas venir tout seul. On donne des pistes, à toi de les explorer...

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par geok120
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./BD-ORTHO-1998/67/67-1998-108/1998-0976-2449-67.txt
    )
    IGN

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Par défaut
    oui ce sont les adresses des cartes de la BD Ortho de l'Alsace

    pour Emmanuel: Merci pour le lien et le conseil mais la vulgarité était-elle nécessaire?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Par défaut
    voilà j'ai maintenant écrit un petit programme qui recherche une sous chaîne à l'intérieur d'une ligne d'un fichier

    je crée une fonction "detection" qui lit mon fichier ligne à ligne avec fgets et qui à chaque ligne compare le pointeur renvoyé par fgets à la sous chaine à reconnaitre. Je renvoie alors "ligne" quand la sous-chaîne a été trouvée (car j'ai besoin de la ligne complète plus tard).

    dans le main, j'utilise la fonction "detection" pour afficher "ligne".

    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
     
    /* fonction detection qui renvoie la ligne ou l'on a trouve la chaine a identifier */
     
    char (*detection) ( char *chaineareconnaitre, FILE *fichierlu)
    	          { char *A;
                      char* ligne;
     
     while(fgets(ligne, 256, fichierlu))
    	                 { A=strstr(ligne,chaineareconnaitre);
    	                   if(A==NULL)
    	                    return 0;
    	                   else return ligne;
    			 }
     
     
    /* dans le main */
    main()
    {FILE *fichierutilise=fopen("reduction.c", "r");
    char *ligne;
    char *coorddupt="quelquechose"; /*en réalité dans le programme total on connait coorddupt  
     
     
    ligne=detection(coorddupt, fichierutilise);
    printf("%s\n", ligne); 
     
     
    }
    A la complilation tout se passe bien.
    Lorsque la sous-chaîne à identifier se trouve sur la première ligne du fichier, mon programme me revoie cette ligne complète: c'est ce que je veux.

    Par contre dès que la sous-chaîne à identifier se trouver sur une autre ligne que la 1ère, mon programme me revoie une "segmentation fault"!
    Ma fonction "detection" ne lit-elle que la première ligne?, normalement non.
    Y a-t-il une autre erreur? je n'ai pas trouvé où

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Primo tu n'alloues pas d'espace mémoire et tu fait un fgets vers quelque chose qui n'est pas alloué. Il te faut faire un malloc de ligne..

    Secondo tu ne boucles pas sur la lecture de ton fichier.. Tu fais un return quel que soit le résultat à la première ligne lue.

    Tertio tes pointeurs ne sont initilialisés.



    Si déjà tu corriges ça, cela devrait aller beaucoup mieux

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par geok120
    A la complilation tout se passe bien.
    Déjà, le code n'est pas complet, difficile de dire si la 'compilation se passe bien'...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:4: error: syntax error before "FILE"
    main.c:5: error: syntax error before '{' token
    main.c:8: error: syntax error before "while"
    main.c:18: warning: return type defaults to `int'
    main.c:18: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:18: error: `FILE' undeclared (first use in this function)
    main.c:18: error: (Each undeclared identifier is reported only once
    main.c:18: error: for each function it appears in.)
    main.c:18: error: `fichierutilise' undeclared (first use in this function)
    main.c:18: warning: implicit declaration of function `fopen'
    main.c:20: warning: initialization discards qualifiers from pointer target type
    main.c:20:33: unterminated comment
    main.c:20: error: syntax error at end of input
    main.c:19: warning: unused variable `ligne'
    main.c:20: warning: unused variable `coorddupt'
    Process terminated with status 1 (0 minutes, 2 seconds)
    9 errors, 6 warnings
    En ajoutant <stdio.h>, c'est légèrement mieux, mais ça reste catastrophique :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:6: error: syntax error before '{' token
    main.c:9: error: syntax error before "while"
    main.c:19: warning: return type defaults to `int'
    main.c:19: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:21: warning: initialization discards qualifiers from pointer target type
    main.c:21:33: unterminated comment
    main.c:21: error: syntax error at end of input
    main.c:19: warning: unused variable `fichierutilise'
    main.c:20: warning: unused variable `ligne'
    main.c:21: warning: unused variable `coorddupt'
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 6 warnings
    Sans parler de la présentation déplorable...
    Une fois réindenté, ça donne :
    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
     
    #include <stdio.h>
     
    /* fonction detection qui renvoie la ligne ou l'on a trouve la chaine a identifier */
     
    char (*detection) (char *chaineareconnaitre, FILE * fichierlu)
    {
       char *A;
       char *ligne;
     
       while (fgets (ligne, 256, fichierlu))
       {
          A = strstr (ligne, chaineareconnaitre);
          if (A == NULL)
             return 0;
          else
             return ligne;
       }
     
    /* dans le main */
       main ()
       {
          FILE *fichierutilise = fopen ("reduction.c", "r");
          char *ligne;
          char *coorddupt = "quelquechose";
          /*en réalité dans le programme total on connait coorddupt
     
             ligne=detection(coorddupt, fichierutilise);
             printf("%s\n", ligne);
     
             }
    Et la, on voit bien que
    • char (*detection) (char *chaineareconnaitre, FILE * fichierlu) n'a aucun sens. C'est sans doute :
      char *detection (char *chaineareconnaitre, FILE * fichierlu)
    • Cette fonction n'est pas terminée (manque un '}')
    • Que l'on pourrait très bien quitter cette fonction sans rien retourner
    • Qu'il manque <string.h> pour strstr().
    • Le commentaire n'est pas terminé (manque un '*/')
    • Qu'il manque un 'int' explicite au main() (obligatoire en C99) et un 'void' pour signifier qu'il n'y a pas de paramètres.
    • Qu'il manque un retour explicite (obligatoire en C90)

    Une fois ces corrections minimales effectuées,
    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
     
    #include <stdio.h>
    #include <string.h>
     
    /* fonction detection qui renvoie la ligne ou l'on a trouve la chaine a identifier */
    char *detection (char *chaineareconnaitre, FILE * fichierlu)
    {
       char *A;
       char *ligne;
     
       while (fgets (ligne, 256, fichierlu))
       {
          A = strstr (ligne, chaineareconnaitre);
          if (A == NULL)
             return 0;
          else
             return ligne;
       }
    }
     
    /* dans le main */
    int main (void)
    {
       FILE *fichierutilise = fopen ("reduction.c", "r");
       char *ligne;
       char *coorddupt = "quelquechose";
       /*en réalité dans le programme total on connait coorddupt */
     
       ligne = detection (coorddupt, fichierutilise);
       printf ("%s\n", ligne);
       return 0;
    }
    on voit bien que la variable 'ligne' n'est pas initialisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Compiling: main.c
    main.c: In function `detection':
    main.c:18: warning: control reaches end of non-void function
    main.c:8: warning: 'ligne' might be used uninitialized in this function
    Il est préférable de travailler avec un compilateur bien réglé...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Pour le reste, tout a été dit...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Par défaut
    merci beaucoup

    ça marche à présent

    Pour ma défense, je dirais juste que j'avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    dans mon programme quand je l'ai testé et que j'avais oublié de le mettre dans mon code
    Pour le reste, merci de votre aide

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

Discussions similaires

  1. Trouver une ligne dans un fichier
    Par Kyti dans le forum Langage
    Réponses: 4
    Dernier message: 22/07/2009, 11h42
  2. [FSO] Effacer une ligne dans un fichier
    Par Johnbob dans le forum ASP
    Réponses: 4
    Dernier message: 30/05/2007, 16h23
  3. [VBA] insérer une ligne dans un fichier excel
    Par cokinoumasterflash dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2005, 18h52
  4. [langage] Effacer une ligne dans un fichier
    Par sebi77 dans le forum Langage
    Réponses: 2
    Dernier message: 01/01/2005, 12h43
  5. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30

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