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 et stockage de valeur


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Lecture de fichier et stockage de valeur
    Bonjour j'ai un soucis avec mon programmes, je suis entrain de m'entraîner mais je bloque.

    J'ai voulus faire un header avec mes variables que voici :

    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
     
    #include <stdio.h>
    #define TAILLE_MAX 100
     
    typedef struct Armes_de_contact Armes_de_contact;
    struct Armes_de_contact
    {
        char Nom[TAILLE_MAX];
        char DM[7];
        char Prix[5];
        int bool_attributs;
        char attribut1[TAILLE_MAX];
    };
     
    Armes_de_contact *tab_armes_de_contact[15];
    Voici le code que j'essaye, je souhaite récupérer caractère par caractère pour ensuite mettre des choses derrières a récupérer plutard.

    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 <string.h>
    #include "Variables.h"
    #define TAILLE_MAX 100
     
    int main(int argc, char** argv)
    {
        FILE *Armes_de_contact_fichier = NULL;
        Armes_de_contact_fichier = fopen("Armes de contact.txt", "r");
        int i,j;
        char boolean;
        char separation;
        if (Armes_de_contact_fichier != NULL)
        {
            for ( i = 0; i < 11; i++)
            {
                boolean = ' ';
                separation=' ';
                for ( j = 0 ; separation!=':';j++) // Je récupère le nom jusqu'à ce que je croise le caractère double points.
                {
                    separation=fgetc(Armes_de_contact_fichier); 
                    tab_armes_de_contact[i].Nom[j]=separation;
                }
                if ( separation == ':')
                {
                    tab_armes_de_contact[i].Nom[j+1]='\0';
                }
            printf("%s ",tab_armes_de_contact[i].Nom);
            }
        }
        else
        {
            printf("erreur");
        }
        return 0;
    }
    Le problème est que cela fonctionne très bien pour de petits mots tel que ( gourdin : ) mais par exemple Epée ou hache à 2 mains est beaucoup trop long et je n'ai pas le mot en entier, alors que pourtant ma variable nom devrais pouvoir la stocker.
    J'ai utiliser le debugguer et je vois bien ma variable separation prendre la bonne valeur à chaque fois cependant je n'arrives pas à accéder aux valeurs de ma structure qui se trouve dans l'autre fichier à l'aide de "Watches"

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, je suis surpris que ceci compile:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Armes_de_contact *tab_armes_de_contact[15];
     
    ...
     
    tab_armes_de_contact[i].Nom
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Est-il possible d'être plus explicite ? Cela compile sans aucun problème.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Bizarre, parce que c'est un tableau de pointeurs et tu l'utilises comme si c'était un tableau de structures...
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Bizarre, parce que c'est un tableau de pointeurs et tu l'utilises comme si c'était un tableau de structures...
    En effet, je n'avais pas vu que j'avais laissé l'étoile.
    Je n'ai pas trouvé comment régler mon problème et j'avais pas d'idée en tête du coup j'essaye des choses et si par miracle j’obtiens un résultat j'essaye de comprendre x')
    Je crois que quand j'ai fait ça je voulais pointer mon tableau de structure, mais c'est faux je crois ?
    Il faudrait plutôt que je fasse quelque chose de ce genre :

    Armes_de_contact armes[15];
    Armes_de_contact *parmes;
    parmes = armes;

  6. #6
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello,

    Le problème c'est que tu déclares ta variable "tab_armes_de_contact" dans le fichier header.
    A chaque fois que tu vas faire une #include de ce header dans un fichier .c, tu vas créer une nouvelle instance de "tab_armes_de_contact", sans lien avec les autres instances.
    Chacun de tes fichiers .c possède donc son propre "tab_armes_de_contact", indépendant des autres.

  7. #7
    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 Dwaper Voir le message
    je souhaite récupérer caractère par caractère pour ensuite mettre des choses derrières a récupérer plutard.
    Bonjour

    Généralement c'est plus pratique de travailler en binaire et d'écrire et lire la structure d'un bloc.
    L'avantage c'est que c'est immédiat. On lit d'un fread() et on écrit d'un fwrite() toute la structure. L'inconvénient c'est que le fichier n'est pas "human readable".

    Sinon, si c'est un impératif que de pouvoir lire et écrire le fichier via le blocnote, alors une autre façon de faire est de lire toute la ligne via fgets() puis ensuite traiter la ligne élément par élément (je pars bien entendu du principe que pour une info, l'ensemble de ses éléments "nom", "DM", "Prix", "bool_attributs" et "attribut" sont tous écrits sur une seule ligne avec un séparateur style "csv").
    Une fois la ligne lue, l'exploser sur le séparateur est assez simple avec strtok_r(). Et une fois explosée, ne reste ensuite qu'à récupérer les éléments épars selon leur nature (strcpy() pour les chaines et strtoul() pour les entiers)...
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Je te remercie, je ne connaissais pas du tout ces fonctions, du coup je pourrais intégrer une fonction utilisant fwrite dans mon programme pour créer les fichiers nécessaires.

    Le problème c'est que tu déclares ta variable "tab_armes_de_contact" dans le fichier header.
    A chaque fois que tu vas faire une #include de ce header dans un fichier .c, tu vas créer une nouvelle instance de "tab_armes_de_contact", sans lien avec les autres instances.
    Chacun de tes fichiers .c possède donc son propre "tab_armes_de_contact", indépendant des autres.
    Je prend note merci !

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/02/2016, 09h24
  2. Réponses: 2
    Dernier message: 18/09/2015, 17h03
  3. Optimisation lecture et stockage de valeurs
    Par Krovax dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/02/2009, 11h44
  4. [Débutant] Lecture de fichier texte et modification de valeurs
    Par niepoc dans le forum MATLAB
    Réponses: 19
    Dernier message: 25/04/2008, 17h32
  5. Réponses: 6
    Dernier message: 02/08/2006, 14h07

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