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 avec fscanf dans un fichier avec délimiteurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut Lire avec fscanf dans un fichier avec délimiteurs
    Bonsoir,

    Actuellement sur un projet, j'ai besoin de lire dans un fichier .txt une ligne écrite sous cette forme (en théorie plusieurs, mais si sa fonctionne pour une, ca fonctionnera pour plusieurs):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bolivar:48.880502:2.374922
    Je dois stocker la chaine Bolivar dans une variable char, 48.xxxx dans une variable float, 2.xxxx dans une autre variable float.

    Je me suis donc servi du scanf de cette façon pour lire les 3 données dont j'ai besoin:

    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
     
    void main()
    {  
            char nomStation[50];
            float latitude[20], longitude[20];
     
            FILE *fichier = NULL;
        fichier = fopen ("stations_metro.txt", "r");
     
            if(fichier != NULL)
            {
                    fscanf(fichier,"%[ˆ:]:%f:%f\n", nomStation, latitude, longitude);
     
                    printf("Nom: %s\n", nomStation);
                    printf("Lat: %f\n", *latitude);
                    printf("Longi: %f\n\n", *longitude);
             }
     
             fclose(fichier);
    }
    Le résultat n'est pas celui que je souhaite, il ne récupère pas le nom (il affiche en tout cas un symbole bizarre), la latitude vaut -0.00000 et la longitude varie, si je lance plusieurs fois le code, la valeur sera différente (des valeurs aléatoires j'ai l'impression)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nom:
    Lat: 0.000000
    Longi: -0.000000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nom:
    Lat: 0.000000
    Longi: -31270482477056.000000
    Je souhaite en plus de cela récupère les séparateurs (: après le nom, : après latitude et \n après longitude) c'est pour cela que je l'ai ai ajouté dans le fscanf.

    Pour information, j'utilise Ubuntu 14.04 pour faire mon code avec l'editeur gedit et le terminal (sans dec' ^^)

    J'ai beaucoup cherché sur internet, j'ai trouvé pas mal de choses, j'ai tout essayé et j'ai erreur plus ou moins farfelue et même des Erreur de segmentation (ça c'est moins bien par contre ...)

    Pouvez vous m'aider sur la syntaxe de la fonction fscanf pour que cela fonctionne correctement ?

    PS: J'ai essayé une méthode autre aussi, à savoir récupèrer toute la ligne avec fgets et la découper apr-s avec strtok (en l'utilisant 3 fois pour avoir les 3 valeurs), cela fonctionne pour quelques lignes et dès que je complique un peu le code (avec des malloc et tout), j'ai des erreurs de segmentation à n'en plus finir.

    PS2: J'aimerais trouver une méthode simple. Sur une autre forum, on m'a suggérer de stocker tout le fichier dans un tableau a deux dimensions et de l'allouer dynamiquement, mais pour quelque chose qui est juste de récupèrer 3 valeurs, je trouve la méthode compliquée et peu fiable.


    En espérant des réponses rapides,

    Cordialement,
    Share45.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    scanf demande des pointeurs, ce que je ne vois pas. Après observation consentieuce, c'est dû à ce que latitude et longitude sont des tableaux (donc converti en pointeurs du premier élément)

    les variables latitude et longitude n'ont pas de raison (dans cet extrait de code) d'être des tableaux.

    Attention, la fonction main n'est pas void, en C standard. Tu ne dois pas avoir activé de warning (ou ne pas en tenir compte).
    Aajoute les options -Wall -Wextra à ta commande de compilation

    Essaie comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main() {  
            char nomStation[50];
            float latitude, longitude;
     
            FILE *fichier = NULL;
            fichier = fopen ("stations_metro.txt", "r");
     
            if (fichier != NULL) {
                    fscanf(fichier,"%[ˆ:]:%f:%f\n", nomStation, &latitude, &longitude);
                    printf("Nom: %s\nLat: %f\nLongi: %f\n\n", nomStation, latitude, longitude);
            }
     
            fclose(fichier);
    }

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    Juste un petit complément au code de leternel: Il faut tester le retour du fscanf. La fonction te retourne le nombre de champs remplis. S'il est différent de 3 pour ton cas, tu ne sais pas ce que contient les variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (fichier != NULL) {
                    if(fscanf(fichier,"%[ˆ:]:%f:%f\n", nomStation, &latitude, &longitude)==3)
                            printf("Nom: %s\nLat: %f\nLongi: %f\n\n", nomStation, latitude, longitude);
                    else
                            printf("Erreur de format !\n") ;
            }
    Bonne continuation.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    c'est vrai, j'ai oublié d'y penser. les scanf retourne le nombre de champ correctement lu.

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant ingénieur électronique et informatique industrielle
    Inscrit en
    Août 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant ingénieur électronique et informatique industrielle

    Informations forums :
    Inscription : Août 2015
    Messages : 28
    Par défaut
    Merci de vos réponses.

    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
    void lectureStation(FILE* fichierStationsMetro, t_station* stationsMetro)
    {	
    	char tempNomStation[50];
    	char tempLatStation[12], tempLongStation[10];
     
            fscanf(fichierStationsMetro,"%[ˆ:]:%s:%s\n", tempNomStation, tempLatStation, tempLongStation);
     
           	printf("%s:%s:%s\n\n", tempNomStation, tempLatStation, tempLongStation);
     
            stationsMetro->nomStation = malloc((strlen(tempNomStation)) * sizeof(char));
    	if (stationsMetro->nomStation == NULL)
    	{
        		printf("Problème d'allocation dynamique (1) \n");
         		exit(EXIT_FAILURE);
    	}
    	else
    	{
    		stationsMetro->nomStation = tempNomStation;
    	}
     
    	stationsMetro->lattitudeStation = malloc((strlen(tempLatStation)) * sizeof(char));
    	if (stationsMetro->lattitudeStation == NULL)
    	{
        		printf("Problème d'allocation dynamique (2) \n");
         		exit(EXIT_FAILURE);
    	}
    	else
    	{
    		stationsMetro->lattitudeStation = tempLatStation;
    	}
     
    	stationsMetro->longitudeStation = malloc((strlen(tempLongStation)) * sizeof(char));
    	if (stationsMetro->longitudeStation == NULL)
    	{
        		printf("Problème d'allocation dynamique (3) \n");
         		exit(EXIT_FAILURE);
    	}
    	else
    	{
    		stationsMetro->longitudeStation = tempLongStation;
    	}
    }
    J'ai utilisé le code fscanf que vous m'avez fourni, et j'ai compléter ma fonction, je n'ai pas d'erreur de compilation.
    Seul problème, l'affichage du résultat n'est pas bon, j'ai des symboles indéfini qui s'affiche a la place du texte récupéré dans le fichier.

    D'ou peut venir l'erreur ? Elle vient du fscanf mais je ne voit pas pourquoi il ne récupère rien.

    Merci de votre aide.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Que donne ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
    	char tempNomStation[50];
    	char tempLatStation[12], tempLongStation[10];
     
            sscanf("<le contenu de la première ligne de ton fichier>\n","%[ˆ:]:%s:%s\n", tempNomStation, tempLatStation, tempLongStation);
     
           	printf("%s:%s:%s\n\n", tempNomStation, tempLatStation, tempLongStation);
            return 0;
    }
    Par ailleurs, pourquoi n'as-tu pas testé le code retour de scanf, comme suggéré par Elijha?

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

Discussions similaires

  1. Lire des ints dans un fichier texte avec java.io
    Par Vcouprie dans le forum Général Java
    Réponses: 1
    Dernier message: 07/02/2013, 20h01
  2. Réponses: 10
    Dernier message: 13/07/2012, 09h39
  3. [Débutant] lire dans un fichier avec linq
    Par theangel2011 dans le forum C#
    Réponses: 8
    Dernier message: 11/08/2011, 12h01
  4. comparaison 1 fichier avec 1 feuille à 1 fichier avec 2 feuilles
    Par sofiane06 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/08/2008, 13h21
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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