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 :

récupération données (fichier texte)


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut récupération données (fichier texte)
    Bonjour,

    voilà je voudrais récupérer toutes les données dans un fichier texte (j'ignore combien il y en a).

    Pour l'instant j'ai le code suivant

    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
    void fonctionfgetc(int * Recuperation)
    {
     
        FILE * FicTxt;
        int recup2;
     
        if((FicTxt = fopen("map1.txt","rt")) == NULL)
        {
            printf("erreur");
            exit(-1);
        }
     
        else
        {   
            while((recup2 = fgetc(FicTxt))!=EOF)
            {            
                printf("recup2 = %c \n",recup2);
            }
         }
        //fermeture du fichier texte
        fclose(FicTxt);
     
    }
     
     
     
     
     
    int main(void)
    {
        struct Joueur joueur1;
        int recup[10]; //tableau, probleme si *recup
        int i=0;
     
        // APPEL FGETC (probleme...)
        fonctionfgetc(*recup);
     
     
        return 0;
    }
    ce code fonctionne mais je dois donner une taille quand je déclare ma variable "recup" et donc je devrais lui donner une très grande taille pour être sur d'avoir assez de place... mais, je ne suis pas sur, en dynamique on peut faire en sorte que tant qu'on n'est pas à la fin du fichier on augmenter la taille de 1 et on récupère le caractère? si oui comment puis je faire ?(je ne vois pas vraiement où allouer... dans le main ou dans la fonction? car si je déclare un *recup dans le main j'ai une erreur...)

    merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Il faut surtout éviter de faire de la réallocation 1 par 1 car ces fonctions sont relativement lentes (enfin nous on le remarque pas trop) donc le plus sage serait d'abord de calculer la taille du fichier, ce que tu peux faire ainsi: Comment connaître la taille d'un fichier (ISO)?

    A partir de cette donnée, tu peux tranquillement allouer un buffer assez grand pour contenir l'intégralité de ton fichier. N'oublie pas cependant d'allouer un peu plus pour socker le zéro de fin de chaîne

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    tu peux te servir de stat pour avoir la taille du fichier, allouer le tout (puisque c'est tout que tu veux récupérer) :

    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
    #include <sys/stat.h>
    
    
    void fonctionfgetc(int **Recuperation)
    {
         struct stat  buf ;
         int     n=0 
    
        FILE * FicTxt;
        int recup2;
     
        if((FicTxt = fopen("map1.txt","rt")) == NULL)
        {
            printf("erreur");
            exit(-1);
        }
    
        fstat ( fileno(FicTxt), &buf );
    
        *Recuperation = malloc (  buf.st_size );
         if ( *Recuperation == NULL )
          {
            printf("erreur d'allocation");
            fclose ( FicTxt );
            exit(-1);
          }
    
         while((recup2 = fgetc(FicTxt))!=EOF)
            {
               (*Recuperation)[n] = recup2 ;
               n = n + 1 ;
               
               printf("recup2 = %c \n",recup2);
            }
    
        //fermeture du fichier texte
        fclose(FicTxt);
     
    }

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ouais tiens j'avais pas pensé à stat

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    ok merci pour vos réponses.

    j'ai encore un petit problème (en utilisant la méthode des stats)

    voici donc la fonction "fonctionfgetc" qu'on a proposé :
    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
     
    void fonctionfgetc(int **Recuperation)
    {
        struct stat  buf;
        int     n=0; 
     
        FILE * FicTxt;
        int recup2;
     
        if((FicTxt = fopen("map1.txt","rt")) == NULL)
        {
            printf("erreur");
            exit(-1);
        }
     
        fstat ( fileno(FicTxt), &buf );
     
        *Recuperation = malloc (  buf.st_size );
         if ( *Recuperation == NULL )
          {
            printf("erreur d'allocation");
            fclose ( FicTxt );
            exit(-1);
          }
     
         while((recup2 = fgetc(FicTxt))!=EOF)
            {
               (*Recuperation)[n] = recup2 ;
               n = n + 1 ;
     
               printf("recup2 = %c \n",recup2);
            }
     
        //fermeture du fichier texte
        fclose(FicTxt);
     
    }
    mais j'ai un souci (les pointeurs c'est pas non plus mon truc.. je comprend les * et les & mais dès qu'il commence à en avoir plusieur je m'y perd )

    le paramètre de la fonction "**Recuperation" c'est un tableau 2D c'est bien ca? (c'est surtout que vois pas à quoi pourrait servir une 2eme dimension...)

    je comprend pas en fait pourquoi il faut "**" et je vois pas dans mon main ce que je dois déclarer et passer en parametre

    sinon le fonctionnement de la fonction là je vois ce que ca fait ( )

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    On peut bien sûr faire des tableaux de tableaux en dynamique par le biais de pointeur sur pointeur mais ici il s'agit en fait de l'adresse du pointeur qui est passé en paramètre. Faire ainsi permet de modifier le pointeur donc de l'allouer etc... et que ca se propage jusqu'au réel pointeur, celui pointé par l'argument. Si tu passais simplement un pointeur il n'y aurais aucune propagation vers l'extérieur de la fonction.

    Si jamais j'était pas assez clair n'hésite pas

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Non ca ira je pense avoir compris

    mais donc dans mon main je fais comme ca? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        int *recup;
        //récupération du fichier
        fonctionfgetc(*recup);
     
        return 0;
    }
    je passe mon pointeur qui sera pointé par la fonction pendant son appel? (si j'ai bien compris )

    en fait je demande car lorsque je compile ca j'ai 0 error 7 warning et quand j'execute j'ai une belle erreur : l'instruction à "....." emploie l'adresse mémoire "....".La mémoire ne peut pas etre "read".


  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Nan faut passer l'adresse, là tu passe la valeur pointée donc il faut faire:
    Les pointeurs sont à étudier d'urgence, c'est la toute puissance du C et si tu ne les maîtrise pas tu risque de faire pas mal de bétises, certaines plus graves que d'autres

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    ah oui merci... l'adresse biensur

    les pointeurs j'ai déjà étudié et j'ai déjà regardé les explications du site... je comprend bien comment ca marche mais dès que je dois les utiliser c'est un peu au pif... je sais pas pourquoi

    en tout merci à vous deux

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Elstak
    ah oui merci... l'adresse biensur

    les pointeurs j'ai déjà étudié et j'ai déjà regardé les explications du site... je comprend bien comment ca marche mais dès que je dois les utiliser c'est un peu au pif... je sais pas pourquoi

    en tout merci à vous deux
    De l'entrainement et de la réflexion, y'a que ca de vrai Bonne continuation

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

Discussions similaires

  1. [1.x] récupération données fichier yml
    Par kifouillou dans le forum Symfony
    Réponses: 3
    Dernier message: 22/07/2008, 12h22
  2. recupération données fichier texte
    Par Elstak dans le forum C
    Réponses: 2
    Dernier message: 25/03/2007, 00h28
  3. Données fichier texte vers BDD
    Par dr_octopus74 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/02/2007, 15h54
  4. [VBA-E] Récupération données fichier texte
    Par Theo28fr dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/07/2006, 08h08
  5. [VBA-E] Tableau de données <=> Fichier Texte
    Par P50 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/12/2005, 16h02

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