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 (strtok)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut Lire un fichier (strtok)
    Bonjour
    J'essaie de lire un fichier dont chaque ligne est structurée de cette manière :

    Renner-Nantz, Jody (530) 752-2906 (530) 753-4759 jjrennernantz@ucdavis.edu

    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
     
    while (fgets(ligne,MAX_LIGNE,f) != NULL)
    	{
    		LigneAnnuaire employe;
    		employe.nom = (char*) malloc(sizeof(char)*TAILLE_MAX);
    		employe.prenom = (char*) malloc(sizeof(char)*TAILLE_MAX);
    		employe.indTelephone = (char*) malloc(sizeof(char)*TAILLE_MAX);
    		employe.telephone = (char*) malloc(sizeof(char)*TAILLE_MAX);
    		employe.indFax = (char*) malloc(sizeof(char)*TAILLE_MAX);
    		employe.fax = (char*) malloc(sizeof(char)*TAILLE_MAX);
    		employe.email = (char*) malloc(sizeof(char)*TAILLE_MAX);
     
    		mot = strtok(ligne, " ,()");
    		strcpy(employe.nom,mot);
     
    		mot = strtok(NULL, " ,()");
    		strcpy(employe.prenom,mot);
     
    		mot = strtok(NULL, " ,()");	
    		strcpy(employe.indTelephone,mot);
     
    		mot = strtok(NULL, " ,()");
    		strcpy(employe.telephone,mot);
     
    		mot = strtok(NULL, " ,()");
    		strcpy(employe.indFax,mot);
     
    		mot = strtok(NULL, " ,()");
    		strcpy(employe.fax,mot);
     
    		mot = strtok(NULL, " ,()");
    		strcpy(employe.email,mot);
    Bien entendu mon code ne fonctionne pas comme il le faut, il ne coupe pas les mots comme il le faut.
    Par exemple je lis Renner-Nantz, ensuite Jody (donc tout va bien) et apres je devrais lire 530 mais je lis un caractere inconnu ! :S

    Merci pour tout aide
    Mary

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Bonsoir,

    Quelques remarques :

    1) Pas de cast après un malloc
    2) sizeof(char) retourne toujours 1, c'est donc un pléonasme lorsqu'on l'utilise dans une multiplication
    3) faire un malloc d'une taille fixe est une erreur de conception, déclare ta structure comme ceci sauf si quelque part tu alloues des tailles différentes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct sla {
    	char 	employe[TAILLE_MAX],
    		prenom[TAILLE_MAX],
    		nom[TAILLE_MAX],
    		indTelephone[TAILLE_MAX],
    		telephone[TAILLE_MAX],
    		indFax[TAILLE_MAX],
    		fax[TAILLE_MAX],
    		email[TAILLE_MAX];
    }LigneAnnuaire;
    4) strtok est une fonction à éviter à tout prix (c'est même écrit dans le man).
    5) si tu l'utilise, teste au moins le retour
    6) Ce 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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAILLE_MAX 64
     
    typedef struct sla {
    	char 	employe[TAILLE_MAX],
    		prenom[TAILLE_MAX],
    		nom[TAILLE_MAX],
    		indTelephone[TAILLE_MAX],
    		telephone[TAILLE_MAX],
    		indFax[TAILLE_MAX],
    		fax[TAILLE_MAX],
    		email[TAILLE_MAX];
    }LigneAnnuaire;
     
    int main()
    {
    	char ligne[] = "Renner-Nantz, Jody (530) 752-2906 (530) 753-4759 jjrennernantz@ucdavis.edu";
    	char *mot;
    	LigneAnnuaire employe;
     
    	mot = strtok(ligne, " ,()");
     
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.nom,mot);
      	printf("%s\n",employe.nom);
     
    	mot = strtok(NULL, " ,()");
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.prenom,mot);
      	printf("%s\n",employe.prenom);
     
    	mot = strtok(NULL, " ,()");	
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.indTelephone,mot);
      	printf("%s\n",employe.indTelephone);
     
    	mot = strtok(NULL, " ,()");
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.telephone,mot);
      	printf("%s\n",employe.telephone);
     
    	mot = strtok(NULL, " ,()");
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.indFax,mot);
      	printf("%s\n",employe.indFax);
     
    	mot = strtok(NULL, " ,()");
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.fax,mot);
      	printf("%s\n",employe.fax);
     
    	mot = strtok(NULL, " ,()");
    	if(mot == NULL) {
    		printf("Erreur avec la ligne\n");
    		return EXIT_FAILURE;
    	}
    	strcpy(employe.email,mot);
     	printf("%s\n",employe.email);
     
    	return EXIT_SUCCESS;
    }
    M'affiche :

    Renner-Nantz
    Jody
    530
    752-2906
    530
    753-4759
    jjrennernantz@ucdavis.edu
    Jc

  3. #3
    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
    1. +1
    2. sizeof(*uneChaine) peut être utile, mais sizeof(char) est toujours inutile en effet.
    3. +1
    4. strtok() est une fonction à éviter quand on le peux. Sous un Visual Studio datant d'avant la version 2005, strtok_r() n'est pas disponible et ne possède pas d'équivalent (ou alors, il faut le coder soi-même).
    5. +1
    6. TLDR.
    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.

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    J'ai demandé à personne de commenté les problèmes de mon code.
    J'apprécie toujours des commentaires pertinents sur mon code qui pourraient m'aider mais quand il ya une réponse a mon probleme.

    Ca change absolument rien je sais deja que strtok n'est pas conseillé mais ca m'aide pas plus a lire mon fichier correctement

    Maryse

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Voici la résolution du problème trouvé par un de mes amis
    mot = strtok(ligne, " ,()\t-");

    Il manquait un \t pour enlever les tabulations.
    C'est pour ca qu'il ne lisait pas les espaces comme il le fallais car c'était un caractere tabulations qui formait un espece de carré noir dans le debugger.

    Mary

  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
    Citation Envoyé par kissmytoe
    Voici la résolution du problème trouvé par un de mes amis
    mot = strtok(ligne, " ,()\t-");

    Il manquait un \t pour enlever les tabulations.
    C'est pour ca qu'il ne lisait pas les espaces comme il le fallais car c'était un caractere tabulations qui formait un espece de carré noir dans le debugger.

    Mary
    Pas de chance pour nous... Nous aurions eu du mal à trouver, il n'y en avait pas dans la chaîne d'exemple.

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

Discussions similaires

  1. [Servlet][EJB]lire un fichier à partir de mon bean
    Par kimausoleil dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/02/2004, 14h26
  2. [MFC] lire un fichier en int
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 09h32
  3. Réponses: 5
    Dernier message: 11/01/2004, 20h17
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 14h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29

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