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 :

lire un fichier qui contient des mots


Sujet :

C

  1. #1
    Membre régulier
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2012
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2012
    Messages : 203
    Points : 85
    Points
    85
    Par défaut lire un fichier qui contient des mots
    Bonjour ,

    j'aimerais bien lire un fichier qui contient des mots séparés par des espaces
    et placer ces mots dans un tableau alloué dynamiquement

    pour un fichier d'entiers séparés par des espaces , ça marche très bien

    j'ai procédé de la même manière en implémentant le code ci dessous , mais ça donne rien lors de la compilation

    j'attend vos conseils ,ils seront les bienvenue

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
     
    int main()
    {
     
        int cpt; int i; char mot[25]={0};
        char *tab;
     
        FILE *fichier = NULL;
     
        fichier = fopen("fich_mot.txt", "r+");
     
     
        cpt=0;
        while(!feof(fichier))
        {
            fscanf(fichier,"%s",mot);
            cpt++;
        }
        tab =(char*)malloc(cpt*sizeof(char));
     
        //Tester l'ouverture du fichier
        if(fichier != NULL)
        {
            rewind(fichier);//renvoyer à la position 0 dans le fichier
            i = 0;
            while (!feof(fichier))
            {             
                 mot = "";
                 fscanf(fichier,"%s",mot);
                 tab[i]=mot;
                 i++;
            }
     
     
            printf("les elements du tableau construits sont : \n");
            for(i=1 ; i<cpt  ;i++)
            {  
                 printf ("tab[%d] = %s ",i,tab[i]);
                 printf("\n"); 
            }
     
            free(tab);  
            fclose(fichier);
         }
        else
        {
            printf("Impossible d'ouvrir le fichier fich_entier.txt");
        }
     
      getch();	
      return 0;
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Quelques remarques préliminaires :
    • tab =(char*)malloc(cpt*sizeof(char)); : le cast de malloc() est inutile en C. Vérifier cette allocation serait mieux
    • ligne 26 : vérifier if(fichier != NULL), c'est bien, mais avant la première utilisation (ligne 18), c'est mieux
    • Plutôt que d'utiliser getch() et <conio.h>, qui ne sont absolument pas portables, utilise getchar() inclu dans <stdio.h>.
    • Ton utilisation de feof() n'est pas correcte. Cf FAQ A quoi sert la "fonction" feof ?
    • mot étant un tableau, tu ne peux pas faire mot = ""; (qui au passage est inutile vu la suite). mot[0] = '\0';.
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      printf ("tab[%d] = %s ",i,tab[i]);
      printf("\n");
      Tu peux directement inclure \n dans la première ligne : printf ("tab[%d] = %s\n",i,tab[i]);

    Venons-en maintenant au cœur de ton problème

    Pour commencer, tu te sers d'un simple pointeur sur char char *tab; pour stocker plusieurs chaînes de caractères.
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = (char*)malloc(cpt*sizeof(char));
    ne fait qu'allouer de l'espace pour cpt caractères. Et chaque tab[i] ne peut stocker en fait qu'un caractère.
    D'où l'erreur que tu as à la ligne printf ("tab[%d] = %s ",i,tab[i]); qui te dit que %s voudrait bien un char * et non char.

    Une autre erreur qui découle en partie de la précédente : tab[i]=mot;.
    L'erreur que tu as vient du fait que tu mets l'adresse d'un tableau à la place d'un caractère char donc.

    Mettons que tu aies corrigé l'erreur précédente et que tab[i] représente bien un char *. Tu n'auras alors plus d'erreur lors de la compilation... Mais qu'en est-il lors de l'exécution ? Je te laisse le découvrir
    Un indice : mot n'est qu'un tableau dont l'adresse est fixe, et dont tu remplaces le contenu à chaque lecture.

    Bonne continuation
    Dernière modification par Invité ; 20/06/2013 à 03h30.

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Hum... Je ne m'y serais pas du tout pris comme ça. J'aurais plutôt utiliser la fonction getline et j'aurais ensuite parser le buffer qu'elle m'aurait retourné. Ca me semble plus simple.

  4. #4
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    getline() n'est pas standard. Comme le PO utilise conio.h y'a de grosse chance qu'il utilise Windows. Ça risque donc de ne pas fonctionner. Du moins avec mingw.


  5. #5
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char mot[25]={0};
    mot = "";
    Et bim !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D:\Users\pgradot\Documents\C\main.c|32|error: incompatible types when assigning to type 'char[25]' from type 'const char *'|
    Il faut utiliser strcpy() pour copier une chaine dans une autre.

    Pourquoi essayer de copier une chaine dans un caractère ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <conio.h>
    getch();
    Enlève conio.h et utilise la fonction getchar(). Tu gagneras en portabilité en utilisant une fonction standard. Ce qui se trouve dans conio.h est spécifique à Windows et ne se comporte pas toujours pareil.

  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par moins1 Voir le message
    getline() n'est pas standard. Comme le PO utilise conio.h y'a de grosse chance qu'il utilise Windows. Ça risque donc de ne pas fonctionner. Du moins avec mingw.

    Je m'en suis toujours servi sans aucun soucis sous linux. Mais si c'est pas standard il vaut mieux éviter dans ce cas. Dommage, elle est si pratique cette fonction...

  7. #7
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    http://linux.die.net/man/3/getline
    Conforming To

    Both getline() and getdelim() were originally GNU extensions. They were standardized in POSIX.1-2008.
    Je viens de tenter de m'en servir avec MinGW sous Windows 7, sans succès...

  8. #8
    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
    Exact, j'ai dû la recoder récemment pour la faire fonctionner sur MinGW32...
    ...et c'était moyen-moyen comme expérience !
    --
    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

  9. #9
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Exact, j'ai dû la recoder récemment pour la faire fonctionner sur MinGW32...
    ...et c'était moyen-moyen comme expérience !
    Boarf ! Tu peux trouver des codes tout fait de moins 50 lignes de 2 fonctions qui le font. C'est pas la mort non plus.

  10. #10
    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
    Je sais que certains codes utilisent eux-même des fonctions pas toujours dispos....
    Et pour faire de l'ultra-portable c'est pas génial...

    Du coup je me trimballe un "ansi.c" (qui sert juste à compiler strictement en ansi) avec pleins de fonctions pompées un peu partout et/ou recodées... et j'ai toujours un peu peur de l'utiliser

    Bref...
    --
    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

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 42
    Points : 80
    Points
    80
    Par défaut
    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
    void filecopy(FILE* inFile, FILE* outFile )
    {
        int c; 
        while((c = getc(inFile)) != EOF)
        putc(c, outFile)
    }
     
    main()
    {
        //Tu fais ce que tu veux !!!! ;) 
        FILE *fichier = NULL;
     
        fichier = fopen("fich_mot.txt", "r+"); 
     
       filecopy(fichier, stdout); //Ecran 
     
    }
    Essaye de modifier ce code pour avoir ce que tu veux.

    Les gars pourquoi vous vous cassez la tête.
    stdin et stdout font largement l'affaire.

    pour le standard (clavier . ecran )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define lire_du_clavier() getc(stdin)
    #define afficher_a_l_ecran(c) putc((c), stdout)
    et c'est tout .

    Bon l'avantage avec les stdin et stdout justement c'est qu'on peut modifier son code pour avoir les I/O formatés, et on peut les redirectionner où on veut buffer(char*) et fichier pour être dans le sujet (j'ai donné la solution juste mais a côté pour que notre ami cherche un peu ) sans oublier de faire des flush. putc() et getc() étant portable, pas de problème de portabilité .

  12. #12
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Participer c'est bien. Répondre à la question, c'est mieux.

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 42
    Points : 80
    Points
    80
    Par défaut Desolé
    Je pensais qu'il était proscrit de donner des réponses toutes faites sur le forum. J'ai juste profité pour donner mon avis sur le débat qui avait suivi après (ce n'étais pas non plus des réponses ou je me trompe).
    En ce qui me concerne, j'ai bel et bien donné une réponse. Si elle n'est pas claire, le mieux c'est de demander au lieu de dire que je n'ai pas donné de réponse.
    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
    void filecopy(FILE* inFile, FILE* outFile )
    {
        int c; 
     
        while(c = getc(inFile)){
            if (c == " "){
                break;
            }
            else
            {
                putc(c, outFile);
            }
        }
    }
     
     
    main()
    {
        FILE *fichier = NULL;
     
        fichier = fopen("fich_mot.txt", "r+"); 
     
       filecopy(fichier, stdin); //Ecran  
     
    }
    Je laisse juste la possibilité de chercher comment mettre le deuxième argument dans son buffer (à l'aide des fonctions évoquées dans certains postes - ), et ensuite , de raffiné la fonction filecopy() (Il manque par exemple la fin du document EOF ). Je pense avoir signaler mon intension , répondre à coté mais laisser des pistes pour résoudre le problème.

    Pour mon orthographe : Desolé je ne suis germanique .

  14. #14
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    C'est le cas ici ou encore .

Discussions similaires

  1. [Débutant] Comment supprimer fichier qui contient ce mot
    Par ptitjibus dans le forum VB.NET
    Réponses: 19
    Dernier message: 03/01/2015, 22h18
  2. Réponses: 1
    Dernier message: 10/12/2014, 15h30
  3. Récupérer le nom d'un fichier qui contient des frames
    Par booraq dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 23/06/2014, 18h16
  4. Réponses: 4
    Dernier message: 30/09/2009, 18h19
  5. Réponses: 5
    Dernier message: 02/02/2006, 23h31

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