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 :

Besoin d'aide pour un exercice en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juin 2021
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 20
    Par défaut Besoin d'aide pour un exercice en C
    Bonjour,

    J'aurais besoin d'aide pour un exercice en C, je suis bloqué je ne comprends pas d'où vient le problème.
    J'ai un fichier "UE1.txt" qui contient un numéro étudiant, un prénom, un nom et une note(ou ABI pour absence non justifiée) par ligne. Exemple:
    15100322 Tom Petit 18.5
    15363222 Alain Terieur 13
    12345235 Rachid Amar ABI
    ...
    J'aimerais stocker dans une variable le retour de fscanf afin d'afficher le nombre de champ par ligne.
    Le problème c'est que à partir d'une certaine ligne fscanf retourne 0. 4 pour la première ligne, 4 pour la seconde, 3 pour la troisième mais après ça déconne et ça retourne 0 pour le reste. Je ne comprends pas d'où vient le problème.

    Le 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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[]){
     
    	if(argc!=2){
    		fprintf(stderr, "Erreur le nombre d'argument n'est pas correct.\n");
    	}
    	FILE *fic=fopen(argv[1],"r");
    	if(fic==NULL){
    		fprintf(stderr, "Fichier innexistant.\n");
    	}
    	int identifiant;
    	char prenom[255];
    	char nom[255];
    	float note;
    	int res;
     
    	res=fscanf(fic,"%d %s %s %f",&identifiant,prenom,nom,&note);
    	printf("%d %d %s %s %f\n",res,identifiant,prenom,nom,note);
    	res=fscanf(fic,"%d %s %s %f",&identifiant,prenom,nom,&note);
    	printf("%d %d %s %s %f\n",res,identifiant,prenom,nom,note);
    	res=fscanf(fic,"%d %s %s %f",&identifiant,prenom,nom,&note);
    	printf("%d %d %s %s %f\n",res,identifiant,prenom,nom,note);
    	res=fscanf(fic,"%d %s %s %f",&identifiant,prenom,nom,&note);
    	printf("%d %d %s %s %f\n",res,identifiant,prenom,nom,note);
    	res=fscanf(fic,"%d %s %s %f",&identifiant,prenom,nom,&note);
    	printf("%d %d %s %s %f\n",res,identifiant,prenom,nom,note);
    	res=fscanf(fic,"%d %s %s %f",&identifiant,prenom,nom,&note);
    	printf("%d %d %s %s %f\n",res,identifiant,prenom,nom,note);
     
     
     
     
    		return 0;
    }
    Le fichier txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    15100322    Tom  Petit  18.5
    15363222    Alain Terieur 13
    12345235    Rachid Amar  ABI
    14222274    Sophie Sticket 8.5
    15339008    Jérôme Lantin   4.5
    14566667    Corentin   Louvain  ABI
    15234331    Louis   Martinez    20
    14445433    Albert Debout        12
    15660078    Lena    Loupi   16.5
    14555555  Zoé Toulemonde  2
    15233339    Julie  Arçon ABI
    15342122  Paul Baluche    5.5
    Le résultat du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    4 15100322 Tom Petit 18.500000
    4 15363222 Alain Terieur 13.000000
    3 12345235 Rachid Amar 13.000000
    0 12345235 Rachid Amar 13.000000
    0 12345235 Rachid Amar 13.000000
    0 12345235 Rachid Amar 13.000000
    ...

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 788
    Par défaut
    Hello,

    Tu t'es fait piéger: ABI n'est pas un float, donc ce champ n'est pas lu et reste dans le buffer, ce qui provoque ensuite des problèmes pour les lectures suivantes. La solution est de lire non pas un float, mais une chaine de caractères (au moins 6 positions pour lire 17.35), et de convertir cette chaine de caractères avec atof() (ou strtof()) si elle ne vaut pas "ABI"

    Edit: tu n'as pas encore vu les boucles ? Que vas-tu écrire comme programme si ton fichier d'entrée contient des centaines d'enregistrements ?

  3. #3
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juin 2021
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 20
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Hello,

    Tu t'es fait piéger: ABI n'est pas un float, donc ce champ n'est pas lu et reste dans le buffer, ce qui provoque ensuite des problèmes pour les lectures suivantes. La solution est de lire non pas un float, mais une chaine de caractères (au moins 6 positions pour lire 17.35), et de convertir cette chaine de caractères avec atof() (ou strtof()) si elle ne vaut pas "ABI"

    Edit: tu n'as pas encore vu les boucles ? Que vas-tu écrire comme programme si ton fichier d'entrée contient des centaines d'enregistrements ?
    Si si j'ai vu les boucles, c'était juste un test le programme au-dessus pour comprendre d'où venait le problème.

    j'ai fait un while(res!=EOF).

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 788
    Par défaut
    Poste le nouveau code, car pour moi tu lis res.

    Tu devrais (au minimum) écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        while(fscanf(file,"%d %s %s %s",....) == 4) {
            // do the job
        }

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    car pour moi tu lis res.
    Non non, s'il a inclus ses res=fscanf(fic, "%d %s %s %f", &identifiant, prenom, nom, &note) dans la boucle il lit bien "fic".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 788
    Par défaut
    Ah oui, tu as raison, j'ai mal lu le code. Désolé pour cette coquille.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par canasucre1 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(argc!=2){
    	fprintf(stderr, "Erreur le nombre d'argument n'est pas correct.\n");
    }
    FILE *fic=fopen(argv[1],"r");
    Tu devrais écrire encore plus collé collé histoire de ne rien perdre et surtout avoir un code encore plus illisible. D'ailleurs tu as laissé un espace de trop après la virgule de stderr.
    Et si le nombre d'arguments n'est pas correct tu fais quand-même le job...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 788
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et si le nombre d'arguments n'est pas correct tu fais quand-même le job...
    De même que si le fichier n'existe pas

  9. #9
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juin 2021
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2021
    Messages : 20
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Tu devrais écrire encore plus collé collé histoire de ne rien perdre et surtout avoir un code encore plus illisible. D'ailleurs tu as laissé un espace de trop après la virgule de stderr.
    Et si le nombre d'arguments n'est pas correct tu fais quand-même le job...
    C'était juste un test le programme, je m'étais pas préoccupé des erreurs. j'ai fait par la suite un exit(EXIT_FAILURE).

Discussions similaires

  1. Besoin d'aide pour un exercice de cours (débutant)
    Par GetZo34 dans le forum Général Python
    Réponses: 8
    Dernier message: 28/09/2017, 00h31
  2. Besoin d'aide pour un exercice en assembleur
    Par rayed dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 13/04/2013, 20h03
  3. besoin d'aide pour un exercice (requêtes sql)
    Par stabii dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/01/2011, 00h00
  4. [Débutant] Besoin d'aide pour un exercice
    Par bebetoalvaro dans le forum Pascal
    Réponses: 9
    Dernier message: 05/02/2007, 01h59
  5. Besoin d'aide pour un exercice sur les registres
    Par zakuza dans le forum Assembleur
    Réponses: 5
    Dernier message: 14/04/2006, 14h23

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