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 :

Lecture de fichier (matricules, noms, prénoms) classés par groupes et entre guillemets


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant en classe préparatoires
    Inscrit en
    Octobre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant en classe préparatoires

    Informations forums :
    Inscription : Octobre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Lecture de fichier (matricules, noms, prénoms) classés par groupes et entre guillemets
    Bonsoir ,

    Je suis étudiant en informatique et je rencontre quelques problèmes avec un tp que je dois rendre cette semaine.

    On nous a donné un fichier qui contient les matricules, noms puis prénoms d'étudiants répartis dans des groupes

    j'aimerais savoir comment lire les matricules noms et prénoms à partir de ce fichier :

    Nom : Capture.PNG
Affichages : 353
Taille : 18,4 Ko

    sachant que les noms et prénoms qui sont composés ( qui contiennent 2 mots ) on été mis entre guillemets, alors comment est-ce que je pourrais les lire sans les guillemets ?
    il y a aussi les mots groupe1 groupe2 et groupe3 qui gênent.
    Voila tout ce que j'ai pu faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char SautDeLigne[256],Mot[7],Matricule[25],Nom[25],Prenom[25];
        FILE* fichier;
        fichier= fopen("Etudiants.txt","r");
        fgets(Mot,7,fichier);
        if (strcmp(mot,"Groupe")!=0)
               fscanf(fichier,"%s %s %s",Matricule,Nom,Prenom);
           }
        else 
                fgets(SautDeLigne,256,fichier);
    Merci .

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par rastuff1418 Voir le message
    sachant que les noms et prénoms qui sont composés ( qui contiennent 2 mots ) on été mis entre guillemets ,alors comment est ce que je pourrais les lire sans les guillemets ?
    Très bonne question. Malheureusement pour toi, le C n'est pas assez intelligent pour le faire à ta place et donc tu vas devoir te le coltiner à la mano.
    Perso ce que je ferais ce serait une fonction à laquelle on passe une chaine textuelle représentant une ligne (ex "Pierre Victor" "Hugo Emile") et qui se chargerait de l'analyser pour en extraire nom d'un côté et prénom de l'autre. Elle pourrait par exemple lire caractère par caractère et si elle trouve un guillemet, si elle trouve un espace, elle prend alors ses décisions pour extraire les choses au bon endroit. Bien entendu cela va sans dire mais cela va encore mieux en le disant, elle recevrait aussi en paramètre les tableaux "nom" et "prenom" à remplir avec le résultat de son travail (pas de variable globale quoi).

    Une fois cette fonction créée et testée, il sera alors facile d'ouvrir le fichier, lire chaque ligne entière avec fgets() et faire traiter cette ligne par la fonction.

    Citation Envoyé par rastuff1418 Voir le message
    il y a aussi les mots groupe1 groupe2 et groupe3 qui gênent.
    Oui effectivement. Faudra donc coder une alternative pour que ton programme traite ces lignes "groupeX" à part (en espérant que le token "groupe" soit garanti).

    Citation Envoyé par rastuff1418 Voir le message
    char SautDeLigne[256],Mot[7],Matricule[25],Nom[25],Prenom[25];
    FILE* fichier;
    fichier= fopen("Etudiants.txt","r");
    fgets(Mot,7,fichier);
    if (strcmp(mot,"Groupe")!=0)
    fscanf(fichier,"%s %s %s",Matricule,Nom,Prenom);
    }
    else
    fgets(SautDeLigne,256,fichier);
    Déjà

    Sinon je me demande comment tu peux croire que si une ligne contient "groupe1" (resp. "groupe2" et "groupe3"), alors ton programme la confondra avec "Groupe". Hé oui, un programme informatique c'est con comme la lune.
    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]

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Je ne suis pas d'accord avec @Sve@r coder une machine à états ("state machine")/ automate, c'est trop compliqué pour @rastuff1418

    Parce que pour moi la solution est très simple : compter le nombre d'espaces
    1. on prend 1 ligne avec la fonction fgets (<- lien cplusplus en anglais)
    2. on utilise la fonction strtok (<- lien cplusplus en anglais) Si aucun espace, on est sur 1 ligne "groupe" (à toi éventuellement de tester la chaîne pour en être sûr). Si 2 espaces (3 retours non NULL), on est dans le cas simple. Si 3 espaces (4 retours non NULL), il faut que la 2ième chaîne commence par le caractère " et la 3ième chaîne finisse par le caractère " (*)


    Édit : (*) je n'ai pas vu que la protection des chaînes de caractères des fichiers .csv s'applique aussi à la 3ième chaîne. Donc, il faut adapter. Voire coder une boucle while pour chaque chaîne nom/ prénom comme je l'ai décrit dans mon message ci-dessous.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je ne suis pas d'accord avec @Sve@r
    , première fois que je te vois pas d'accord avec moi. Ptet le changement d'heures...

    Citation Envoyé par foetus Voir le message
    Si aucun espace, on est sur 1 ligne "groupe" (à toi éventuellement de tester la chaîne pour être sûr).
    Ok. Tu pars du principe que le token "groupe" n'est pas assuré donc tu dis "un seul mot et c'est une ligne de groupe". Pas de souci. En l'absence de directives sur ce point, c'est effectivement plus rassurant.

    Citation Envoyé par foetus Voir le message
    Si 2 espaces (3 retours non NULL), on est dans le cas simple. Si 3 espaces (4 retours non NULL), il faut que la 2ième chaîne commence par le caractère " et la 3ième chaîne finisse par le caractère ".
    Et que penses-tu d'une ligne contenant "Hubert de la Haute" "Charles Emile Victor" ???

    Citation Envoyé par foetus Voir le message
    coder une machine à états ("state machine")/ automate, c'est trop compliqué pour @rastuff1418
    Boah c'est pas super compliqué d'inverser un flag 0/1 1/0 chaque fois qu'on rencontre un guillemet.
    Et ensuite, tant que le flag est à 1 on traite tout caractère lu comme faisant partie de la chaine à stocker et s'il est à 0 alors on prend en compte l'espace comme séparateur. Il a quand-même parlé de "tp" et d'une semaine pour le faire...
    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]

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et que penses-tu d'une ligne contenant "Hubert de la Haute" "Charles Emile Victor" ???
    Ce n'est pas précisé mais simplement une boucle while.

    Si la 2ième ou la 3ième chaîne commence par le caractère ", on boucle tant qu'1 chaîne ne finit pas par le caractère " (et ensuite il faut respectivement exactement soit 1 chaîne soit la fin de ligne)
    Sinon, le ligne est mal formée

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Créer une fonction générique pourrait traiter simplement le problème. On pourrait utiliser un getNextWord() qui rechercherait le 1er et dernier caractère du prochain 'mot' d'une chaîne de caractère.
    - sauter les éventuels espaces
    - si prochain caractère est " le 'mot' débute juste après et se termine juste avant le prochain ".
    - sinon le 'mot' débute au caractère courant et se termine juste avant le prochain espace ou la fin de chaîne.

    Et utiliser cette fonction plusieurs fois sur une ligne pour en extraire les composants.

Discussions similaires

  1. [MySQL] besoin d'aide pour comprendre les injections sql
    Par cassy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/01/2007, 14h21
  2. [langage] Avoir les fichiers d'un rep
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 24/10/2006, 12h46
  3. Réponses: 45
    Dernier message: 04/05/2006, 01h10
  4. Besoin d'aide pour recuperer les fichier d'un projet
    Par barthelv dans le forum Applications et environnements graphiques
    Réponses: 9
    Dernier message: 14/04/2006, 11h47
  5. [langage] Trouver les fichiers sans la case
    Par nledez dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2004, 12h07

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