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 texte


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut Lire un fichier texte
    Bonjour,
    Pendant un test en C/C++ ,j'ai eu l'exercice suivante.Est-ce que quelqu'un a une idée car j'étais scotché.Merci d'avance

    ----------------------------------------------
    Ecrire en C/C++ (mais sans utiliser STL), le programme qui lit un fichier texte et produit un rapport contenant la liste des mots de 1 lettre, de 2 lettres ...
    Chaque liste de mots devra être triée par ordre alphabétique.
    Vous disposez de la fonction LireMot ayant pour prototype : char *LireMot(FILE *monFichier); Cette fonction renvoie un pointeur null lorsque la fin du fichier est atteinte.
    Sinon elle alloue un buffer qui devra être libéré par vos soins et qui contient le mot qui a été lu.

    Exemple du rapport à produire :
    Mot de 1 lettre(s) :
    à
    l

    Mot de 2 lettre(s) :
    Au
    de
    le

    Mot de 5 lettre(s) :
    autre
    carré
    ------------------------------------------------
    Audrey

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Si tu sais lire un fichier de façon séquentielle tu as déjà les bases pour cet exercice mais nous ne sommes pas là pour le faire à ta place !

    On peut t'aider si tu as un soucis dans un code mais sinon faut que tu travail par toi même, c'est d'ailleurs le meilleur moyen pour que ca rentre dans le crâne !

    Tape ton code suivant ce que tu penses être le mieux puis montre nous-le, là on t'aidera

    Déjà faut choisir: C ou C++ ? Si c'est pour C++ vas sur le forum juste en-dessous !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Audrey le multi-post est interdit

    Donne-nous tout le code que tu as produit sur le post originel dans la partie C++.

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Bonjour le forum,
    Voici mon essai:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define VALUE 512
     
    void setSequence(char *filename){
    	long SIZE = VALUE;
    	char ligne[VALUE];
    	char *Sequence = (char *)malloc(SIZE*sizeof(char));
    	if(Sequence==NULL){
    		fprintf(stderr, "Memory allocation error !\n");
    		exit(2);
    	}
           file=char *LireMot(FILE *monFichier)
    		if(file==NULL){
    		fprintf(stderr, "Can not access to %s\n", filename);
    		exit(3);
    	}
    	while(fgets(ligne, sizeof ligne, file)){
          if(ligne[0] != '>')
          {
             strcat(Sequence, ligne);
             SIZE=SIZE+VALUE;
             Sequence = (char *)realloc(Sequence, SIZE*sizeof(char));
             if(Sequence==NULL){
    		 	fprintf(stderr, "Memory allocation error !\n");
    		 	exit(2);
    		 }
          }
       }
       printf("%s\n", Sequence);
    }

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut

  6. #6
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Bonjour,
    Un bon point pour toi: tu testes le retour de tes fonctions.

    Je pense que ton algo n'est pas adapté au problème.

    Maintenant, les erreurs de ton code:

    Citation Envoyé par audreylamba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *Sequence = (char *)malloc(SIZE*sizeof(char));
    	if(Sequence==NULL){
    		fprintf(stderr, "Memory allocation error !\n");
    		exit(2);
    	}
    Il ne faut pas caster le retour de malloc. Et si tu remplaces sizeof(char) par sizeof(*Sequence), la maintenance du code sera plus simple (pas primordial dans ton exercice, mais c'est une bonne habitude à prendre).
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *Sequence = malloc(SIZE * sizeof(*Sequence));
    Citation Envoyé par audreylamba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file=char *LireMot(FILE *monFichier);
    Là, tu mélanges la déclaration de la fonction et son appel.
    Pour appeler la fonction LireMot, tu dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FILE *monFichier = fopen(filename, "r");
    if (monFichier == NULL) {
    	fprintf(stderr, "Can not open file %s\n", filename);
    	exit(3);
    }
    char *file = LireMot(monFichier);
    J'arrête là. Mais tu gagneras en sagesse () en lisant ces quelques notes: http://emmanuel-delahaye.developpez.com/notes.htm

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Rebonjour le forum,
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void setSequence(char *filename){
    	int SIZE = 512;
    	char ligne[SIZE];
    	char *Sequence = malloc(SIZE * sizeof(*Sequence));
    	if(Sequence==NULL){
    		fprintf(stderr, "Memory allocation error !\n");
    		exit(2);
    	}
    	FILE *monFichier = fopen(filename, "r");
    if (monFichier == NULL) {
    	fprintf(stderr, "Can not open file %s\n", filename);
    	exit(3);
    }
    char *file = LireMot(monFichier);
     
    	if(file==NULL){
    		fprintf(stderr, "Can not access to %s\n", filename);
    		exit(3);
    	}
    	while(fgets(ligne, sizeof ligne, file)){
          if(ligne[0] != '>')
          {
             strcat(Sequence, ligne);
             char *tmp = (char *)malloc(SIZE*sizeof(char));
             if(tmp==NULL){
    		 	fprintf(stderr, "Memory allocation error !\n");
    		 	exit(2);
    		 }
             SIZE*=2;
             tmp = Sequence;
             Sequence = (char *)realloc(Sequence, SIZE*sizeof(char));
             if(Sequence==NULL){
    		 	fprintf(stderr, "Memory allocation error !\n");
    		 	exit(2);
    		 }
             Sequence = tmp;
             free(tmp);
          }
       }
       	printf("%s\n", Sequence);
    }
    Y a encore des chemins à faire
    Audrey

  8. #8
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par audreylamba
    Y a encore des chemins à faire
    Audrey
    Il faudrait revoir ton algo, parce que ce code ne répond pas vraiment au problème.
    Il faut:
    • ouvrir le fichier
    • lire un mot
    • calculer la longueur de ce mot, et le ranger dans la liste des mots de la même longueur (liste triée par ordre alphabétique)
    • si la fin du fichier n'a pas encore été atteinte, retourner à l'étape 2
    • afficher le rapport (i.e. afficher toutes les listes de mots)

  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 audreylamba
    Pendant un test en C/C++
    N'existe pas. Il y a C et il y a C++. Ce sont deux langages différents. Si on t'a enseigné le contraire, quitte ce cours et fait toi rembourser...

    Alors quel langage ?

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Pour ton realloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sequence = (char *)realloc(Sequence, SIZE*sizeof(char));
    je passerais plutôt par un pointeur temporaire pour plus de sécurité (pour le cas où realloc échoue):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char * tmp = NULL;
    tmp = realloc (Sequence, SIZE * sizeof (char));
     
    if (tmp != NULL)
    {
       Sequence = tmp;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2005, 15h57
  2. [Applet] lire un fichier texte
    Par lebesnec dans le forum Applets
    Réponses: 2
    Dernier message: 07/07/2005, 10h09
  3. Réponses: 1
    Dernier message: 24/11/2004, 16h54
  4. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/08/2004, 15h22
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

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