Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de fscanf sur une structure en C

14 janvier 2020 à 15:39:08

Bonjour, en ce moment je dois faire un projet en C où je dois créer un programme qui gère les différents logements d'un Crous.

J'ai un fichier Etudiant qui contient certaines caractéristiques à leur propos.

Pour les manipuler, j'ai choisi de créer un tableau de structure avec une allocation dynamique.

Mon problème est que j'utilise mal le flot de la fonction de lecture du fichier (Enfin je pense). 

 Voilà à quoi ressemble le fichier texte.

  Voilà les définitions des structures.

Voilà la fonction qui lit dans le fichier.

Voilà la fonction de chargement.

Enfin, voilà ce que la console affiche lorsque je mets un printf("%s\n", a.prenom); juste après les affectations de a.

Merci d'avance.

-
Edité par LezeRaide 14 janvier 2020 à 17:51:39

  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2020 à 15:53:41

slt,

Avant toute choses utilise le bouton (</>) de l'editeur integré pour poster ton code, personne ne va vouloir le recopier pour tester ^^,

on à pas la fonction d'affichage donc difficile de dire si ce que tu affiche est correct ^^.

  • Partager sur Facebook
  • Partager sur Twitter

la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

Mon GitHub

14 janvier 2020 à 15:56:53

Désolé je ne poste presque jamais rien. Voilà : 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef enum{Non, Oui} Booleen;

typedef struct{
	int idEtudiant;
	char Civilite;
	char prenom[16];
	char nom[16];
	Booleen Boursier;
	int Echelon;
	Booleen Handicape;
}Etudiant;

Etudiant LireEtudiant(FILE *flot){

    Etudiant a;

    fscanf(flot, "%d%c%*c", &a.idEtudiant, &a.Civilite);
    fscanf(flot, "%s %s", a.prenom, a.nom);
    fscanf(flot, "%d\t%d\t%d", &a.Boursier, &a.Echelon, &a.Handicape);
    printf("%s\n", a.prenom);
    return a;

}


Etudiant * ChargeEtudiant(int *nb, int *max){

    Etudiant *tab, *aux, a;
    FILE *flot;
    flot= fopen("Etudiants.txt", "r");
    if(flot==NULL){
        printf("Erreur d'ouverture du fichier.\n");
        exit(1);
    }

    *nb=0;
    *max=100;

    tab=(Etudiant*) malloc((*max)*sizeof(Etudiant));
    if(tab==NULL){
        printf("Erreur malloc.\n");
        exit(1);
    }

    a= LireEtudiant(flot);

    while(!feof(flot)){

        if(*nb==*max){

            aux=(Etudiant*) realloc(tab, (*max+100)*sizeof(Etudiant));
            if(aux==NULL){
                printf("Erreur Realloc.\n");
                exit(1);
            }

            tab=aux;
            *max+=100;

        }

        tab[*nb]= a;
        *nb+=1;
        a= LireEtudiant(flot);

    }

    fclose(flot);
    free(aux);
    return tab;

}

void AfficherEtudiants(Etudiant *tab, int nb){

    int i=0;

    while(i<nb){

        printf("%d\t%c\t%s\t%s", tab[i].idEtudiant, tab[i].Civilite, tab[i].prenom, tab[i].nom);
        switch(tab[i].Boursier){
            case 1:
                printf("\tNon");
                break;
            case 0:
                printf("\tOui");
                break;
        }

        printf("\t%d", tab[i].Echelon);

        switch(tab[i].Handicape){
            case 1:
                printf("\tNon\n");
                break;
            case 0:
                printf("\tOui\n");
                break;
        }

        i+=1;

    }

}
  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2020 à 17:46:42

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Mauvais titre

Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

Pour modifier votre titre, éditez le premier message de votre sujet.

(titre originel : A l'aide)

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2020 à 1:01:39

Les mots "oui" et "non" dans ton fichier ne sont pas des entiers, tu ne peux les lire que comme des chaînes de caractères, c'est seulement après que tu les convertiras en entier ou en ton type enum booleen !

  • Partager sur Facebook
  • Partager sur Twitter
2 mai 2023 à 0:18:32

Bonjour moi aussi j'ai un problème avec la fonction fscanf, j'essaie de l'utiliser sur un pointeur mais ça ne marche pas, on me dit, you need to put a primary function
  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2023 à 16:59:02

JeanMichelMpunga1 a écrit:

Bonjour moi aussi j'ai un problème avec la fonction fscanf, j'essaie de l'utiliser sur un pointeur mais ça ne marche pas, on me dit, you need to put a primary function


Quel hasard. Vous etiez faits pour vous rencontrer, c'etait écrit dans les astres.

Sinon, ça s'explique peut être à partir du code qu'on ne voit pas.

-
Edité par michelbillaud 27 mai 2023 à 17:01:25

  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2023 à 19:16:24

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter