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 :

Lecture Fichier


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut Lecture Fichier
    Bonjour à tous !!!
    Un problème s'oppose à moi. Je voudrais savoir comment faire pour lire aléatoirement un mot dans un fichier (dico.txt) puis le stocker par la suite dans un tableau.
    En revanche, j'arrive très bien à lire le fichier grace à la fonction : fgetc (fichier).
    Merci...

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Que veux-tu dire par lire aléatoirement un mot dans un fichier? Pour lire une ligne tu as fgets. Pour aller à la ligne n (ligne 0 = première ligne) tu vas au début du fichier puis fais fgets n fois (en supposant qu'un ton buffer est assez large pour contenir n'importe quelle ligne). Que demande le peuple?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    C'est vrai. Mais, en fait, je croyais que fgets, s'était uniquemenent pour récupérer des valeurs dans un fichier.
    Je vais voir ce que ça donne.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Si tu souhaite vraiment lire de manière aléatoire,
    regarde du coté de fseek (se positionner à un endroit quelconque)et ftell.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    C'est quoi fseek et ftell. Moi, je connais uniquement srand.
    En fait, ce que je comptais faire, c'est de choisir un ligne aléatoire
    puis, de relever le mot dans un tableau.
    Parce que, après, je dois mélanger les lettres, mais, c'est beaucoup plus simple une fois qu'il est dans le tableau.
    Voila

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    En fait, ce que je comptais faire, c'est de choisir un ligne aléatoire
    puis, de relever le mot dans un tableau.
    Voilà que mes craintes s'affirment. Pour aller à la ligne n tu fais comme je t'ai montré. Pour la lire c'est tout simplement ensuite fgets. Où est le problème? Si tu ne sais pas comment générer un nombre aléatoire, laisse tout d'abord tomber cette histoire de fichier puis lis la doc de rand et srand. Si tu sais comment générer un nombre aléatoire mais pas comment lire une ligne dans un fichier alors laisse d'abord les nombres aléatoires et lis la doc de fgets. Après tu sauras les combiner.
    C'est quoi fseek et ftell.
    Des fonctions qui permettent de modifier/obtenir la position courante dans un fichier lorsque celà a un sens. S'utilisent généralement avec des fichiers binaires, rarement avec les fichiers texte (sauf pour se positionner au début : fseek(f, 0L, SEEK_SET)).

  7. #7
    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 sebastien83310 Voir le message
    Bonjour à tous !!!
    Un problème s'oppose à moi. Je voudrais savoir comment faire pour lire aléatoirement un mot dans un fichier (dico.txt) puis le stocker par la suite dans un tableau.
    En revanche, j'arrive très bien à lire le fichier grace à la fonction : fgetc (fichier).
    Merci...
    En supposant qu'il y a un mot par ligne :

    Une fois au début du programme :
    1. initialiser le générateur pseudo-aléatoire (srand())


    ...

    Tirer un mot au hasard dans le fichier :
    1. ouvrir le fichier en mode texte (fopen() avec "r")
    2. compter les lignes (les '\n' avec fgetc())
    3. tirer un numéro de ligne au pseudo-hasard (rand())
    4. revenir au début du fichier (rewind())
    5. lire les lignes (fgets()) en les comptant jusqu'à la valeur voulue
    6. supprimer le '\n' du mot lu

    La programmation, c'est le processus intellectuel qui permet d'élaborer cette séquence d'instruction. Ca demande surtout beaucoup de bon sens. Le codage, c'est rien...

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Une autre possibilité c'est que toutes les lignes du fichier dictionnaire aient la même longueur.

    A ce moment, la calcul du nombre de lignes est simple (taille fichier / longueur ligne)

    Le déplacement à une ligne aléatoire est simple (fseek)

    En fait c'est beaucoup simple mais :
    * Quel gachis de place dans le fichier
    * Gare à toi si TOUTES les lignes n'ont pas la même longueur
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Comme l'expliquait Emmanuel Delahaye, je n'arrive pas a compter le nombre de \n.

    je suis dans cette situation:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main(void)
    {
        FILE * dico;
        int c, a=0;
     
        srand(time(NULL));
     
        dico = fopen ( "C:/Documents and Settings/Sébastien/Mes documents/DUT - GEII/Language C/dico.txt" , "r" );
     
                if ( dico == NULL )
                {
                 printf("Erreur d'ouverture du fichier !\n");
                }
                else 
                {
                printf("Ouverture: OK\n");
                printf("Veuillez patientez...");     
     
                     while ( c != EOF )
                     {
                          c=fgetc(dico);
                           if(c=='\n')
                           {
     
                              a++; 
     
                           }
     
                     }
                     printf("Il y a %d mots.",a);
                }
     
        fclose(dico);
     
     
        system("pause");
        return 0;
    }
    Si quelqu'un paut m'aider.....

  10. #10
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Bonjour,

    * quand tu envoies un code ici, (le symbole # dans les boutons).

    * lorsque tu fais while ( c != EOF ) la première fois, c n'est pas initialisé.

  11. #11
    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 sebastien83310 Voir le message
    Comme l'expliquait Emmanuel Delahaye, je n'arrive pas a compter le nombre de \n.

    je suis dans cette situation:
    <...>
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <stdio.h>
    #include <time.h>
     
    #if 0
    #define F_DICO "C:/Documents and Settings/Sébastien/Mes documents/DUT - GEII/Language C/dico.txt"
    #else
    #define F_DICO "/dev/dico/dico_fr_maj.txt"
    #endif
     
    int main (void)
    {
     
       srand (time (NULL));
     
       FILE *dico = fopen (F_DICO, "r");
     
       if (dico == NULL)
       {
          printf ("Erreur d'ouverture du fichier !\n");
       }
       else
       {
          int c, a = 0;
          printf ("Ouverture: OK\n");
          printf ("Veuillez patientez...\n");
     
          while ((c = fgetc (dico)) != EOF)
          {
             if (c == '\n')
             {
                a++;
             }
          }
          printf ("Il y a %d mots.\n", a);
          fclose (dico);
       }
     
       return 0;
    }
    fonctionne chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Ouverture: OK
    Veuillez patientez...
    Il y a 336531 mots.
     
    Press ENTER to continue.

  12. #12
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par ram_0000
    Une autre possibilité c'est que toutes les lignes du fichier dictionnaire aient la même longueur.
    ...
    Le déplacement à une ligne aléatoire est simple (fseek)
    Non on n'utilise pas fseek de cette manière dans un fichier texte. Pour aller à une ligne dans un fichier texte il n'y a pas 36 solutions : lire successivement toutes les lignes précédentes (mais pour faire ça il y a plus d'une méthode ...).

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Melem Voir le message
    Non on n'utilise pas fseek de cette manière dans un fichier texte. Pour aller à une ligne dans un fichier texte il n'y a pas 36 solutions : lire successivement toutes les lignes précédentes (mais pour faire ça il y a plus d'une méthode ...).
    Je persiste, si toutes les lignes ont la même longueur et si seulement elles ont la même longueur, la fonction fseek() permet de se déplacer directement à la ligne souhaitée si on connait la longueur d'une ligne.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Non on n'utilise pas fseek de cette manière dans un fichier texte. Pour aller à une ligne dans un fichier texte il n'y a pas 36 solutions : lire successivement toutes les lignes précédentes (mais pour faire ça il y a plus d'une méthode ...)
    Non, vu que fseek permet de se déplacer dans un fichier (indépendamment de son type texte/binaire) donc si l'on connait la taille d'une ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(filestream, line_size * random(), SEEK_SET);

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu utilises fseek() en te basant sur la taille d'une ligne, tu utilises la façon dont le texte est codé. Tu n'utilises donc plus le fichier comme un fichier texte, mais comme un fichier binaire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Par contre, tu peux toujours lire le texte entièrement en ne retenant en mémoire que l'offset de chaque ligne (un petit ftell() à chaque ligne et une liste dynamique d'offsets) puis, une fois que tu connais ainsi le nombre de lignes (il sera égal à la taille de ta liste), générer un nombre au hasard et aller à l'offset correspondant avec fseek()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Si tu utilises fseek() en te basant sur la taille d'une ligne, tu utilises la façon dont le texte est codé. Tu n'utilises donc plus le fichier comme un fichier texte, mais comme un fichier binaire.
    Mais un fichier binaire ou texte c'est la même chose.
    'Juste' le contenue qui change, je crois qu'il n'y a pas de différence au niveau du système.

    Enfin je ne comprend pas le "utilisé comme un fichier texte".

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est principalement une différence de philosophie.
    Ce qui est sûr, c'est que le "fichier texte" fait complètement abstraction de la façon dont est codé le texte. Un programme qui lit un fichier texte n'a pas à se soucier de cela, ni de la taille en octets d'une chaîne (ce qui était le cas avec ton idée).
    Un exemple réel de l'abstraction qu'on voit dans les fichiers texte, c'est pour les fins de ligne: Quelle que soit la manière dont une fin de ligne est vraiment codée, les fonctions de lecture la retournent toujours sous forme d'un \n.

    Dès qu'on se met à parler de notions à plus bas niveau (comme la taille de la chaîne en octets), on ne fait plus du "vrai" Fichier Texte.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est principalement une différence de philosophie.
    Ce qui est sûr, c'est que le "fichier texte" fait complètement abstraction de la façon dont est codé le texte. Un programme qui lit un fichier texte n'a pas à se soucier de cela, ni de la taille en octets d'une chaîne (ce qui était le cas avec ton idée).
    Un exemple réel de l'abstraction qu'on voit dans les fichiers texte, c'est pour les fins de ligne: Quelle que soit la manière dont une fin de ligne est vraiment codée, les fonctions de lecture la retournent toujours sous forme d'un \n.

    Dès qu'on se met à parler de notions à plus bas niveau (comme la taille de la chaîne en octets), on ne fait plus du "vrai" Fichier Texte.
    Pas faux

  20. #20
    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 totaliou Voir le message
    Mais un fichier binaire ou texte c'est la même chose.
    'Juste' le contenue qui change, je crois qu'il n'y a pas de différence au niveau du système.

    Enfin je ne comprend pas le "utilisé comme un fichier texte".
    Un fichier ouvert en mode binaire est lu tel quel. Pas d'interprétation. Un fichier ouvert en mode texte est lu en interprétant certains caractères (ou séquences de caractères). Ca dépend du système.

    http://emmanuel-delahaye.developpez....s.htm#fichiers

Discussions similaires

  1. Lecture fichier Word et remplacement paramètre
    Par Pfeffer dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/02/2005, 17h30
  2. [ifstream] pb lecture fichier non sequentielle
    Par bludo dans le forum SL & STL
    Réponses: 3
    Dernier message: 10/02/2005, 21h30
  3. [LG]probleme lecture fichier
    Par yp036871 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2004, 19h22
  4. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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