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 :

Fonction de copie du contenu d'un fichier dans une variable


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Fonction de copie du contenu d'un fichier dans une variable
    Bonjour à tous,

    Je souhaite faire une fonction qui récupère le contenu d'un fichier et le stock dans une variable, avec un prototype du genre :
    char* readFile(char path)
    qui renvoie l'adresse du début de la chaine de caractère et qui renvoie NULL si erreur. Le but état de pouvoir faire :
    contenu = readFile(char path);
    et avec un printf de contenu je pourrais l'afficher.

    Seulement je m'embrouille (comme vous avez pu le voir) avec les types et je me suis perdu , est-ce que quelqu'un peu m'aider ? Je peu poster mon code si ça vous sert.

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Il faut savoir qu'en C, tu es très proche du fonctionnement réel de la machine et que, donc, c'est toi qui doit gérer l'organisation de tes données dans la mémoire, au moins dans une certaine mesure.

    Ça veut dire qu'il n'y a pas, en C, de type « chaîne de caractère » (string) en particulier, comme on peut le voir dans les langages des niveaux au-dessus, et ceci pour la bonne raison que non seulement la taille d'une chaîne n'est pas connue à l'avance, mais en plus, elle peut varier. Ceci nécessite donc une gestion relativement sophistiquée de la mémoire et, en C, celle-ci se fait explicitement.

    « char * » ne veut pas dire « chaîne » mais « pointeur vers un caractère », et ceci parce que le meilleur moyen pour transmettre une chaîne de caractères — ou de quoi que ce soit d'autre, par exemple une chaîne d'entiers — consiste à la stocker en mémoire et dire à la fonction où elle se trouve, et plus précisément où elle débute. « char * » est donc un pointeur qui, généralement, pointe le premier caractère d'une chaîne.

    Pour faire ce que tu veux faire, donc, il faut que ta fonction alloue suffisamment de mémoire grace à malloc(). Cette fonction te renvoie un pointeur vers de la mémoire allouée, et c'est dans cette mémoire que tu vas charger le contenu de ton fichier.

    Pour savoir quelle quantité de mémoire allouer, soit tu utilises stat() pour connaître à l'avance la taille de ton fichier et tout charger en une seule fois, soit, si ce n'est pas possible, tu utilises un bloc de taille arbitraire que tu agrandis si nécessaire avec realloc() (et également pour réduire la plage à la taille exacte du fichier lorsque tu en as rencontré la fin).

    Ensuite, il te suffit de renvoyer ce même pointeur à la fonction appelante avec return.

    Note toutefois que cette fonction appelante devra libérer cette mémoire elle-même avec free().

  3. #3
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Tiens si tu veux, je m'étais fais mes fonctions pour ça.
    Je t'ai mis un exemple de main pour l'utiliser.
    En espérant que cela te soit utile.

    Bon courage.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <limits.h>
     
    char  *allocateCharPtr  ( int wordSize )
    {
        char *ptr = (char*)malloc(wordSize*sizeof(char));
     
        if ( ptr != NULL )
        {
            return ptr;
        }
     
        else perror("\n ERROR in allocateCharPtr ");
    }
     
    /* Fonction qui récupère le nombre de caractères contenu le fichier */
    int getCharFilesNumbers ( char *filePath )
    {
        FILE *file = fopen( filePath,"r");
     
        if( file != NULL )
          {
              int  counter = 0;
              char c;
     
              while( fscanf( file,"%c",&c ) != EOF )
              {
                  if ( counter < INT_MAX )
                  {
                     counter++;
                  }
     
                  else perror("\n ERROR in getCharFilesNumber 2 ");
              }
     
              return counter;
          }
     
        else perror("\n ERROR in getCharFilesNumber 1 ");
     
      fclose(file);
    }
     
    /* Fonction pour mettre en mémoire un fichier */
    char *fileToString( char *filePath, int *bufferLength )
    {
     
        FILE *file = fopen( filePath,"r" );
     
        if( file != NULL && bufferLength != NULL)
        {
                 *bufferLength = getCharFilesNumbers(  filePath     );
            char *buffer       = allocateCharPtr    ( *bufferLength );
     
            char  c;
            int   offset = 0;
     
            while( fscanf( file,"%c",&c ) != EOF )
            {
                buffer[offset] = c;
                offset++;
            }
     
            return buffer;
        }
     
        else perror("\n ERROR in fileToString ");
     
        fclose(file);
    }
     
    int main ()
    {
        int size = 0;
        char *fileMemorized = fileToString( "fichier.txt", &size );
     
        int i;
        for ( i=0 ; i<size ; i++ )
        {
            printf("%c", fileMemorized[i]);
        }
     
        return 0;
    }
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  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 : 46
    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


    Mon objet C_Str (manipulation de chaînes) permet ceci et bien d'autres choses
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci à tous d'avoir répondu et merci à darkwall_37 d'avoir proposé une réponse

  6. #6
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et celle de darkwall n'est pas la bonne

    c'est celle d 'obsidian...


    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. [Débutant] recuperer le contenu d'un fichier dans une variable.
    Par Warlox dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/12/2011, 16h34
  2. Réponses: 3
    Dernier message: 28/05/2009, 15h27
  3. [Batch] Stocker le contenu d'un fichier dans une variable
    Par grandthor dans le forum Scripts/Batch
    Réponses: 10
    Dernier message: 15/04/2009, 08h47

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