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écuperer tout le contenu d'un fichier texte dans un buffer


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut récuperer tout le contenu d'un fichier texte dans un buffer
    Bonjour,

    J'aimerais savoir comment fait- on pour lire un fichier texte en C et stocker tout le texte dans un buffer. Le code que j'ai écris ci-dessous lit et écrase les données au fur et à mesure. A la fin de la boucle, il ne reste plus que la dernière ligne du fichier...

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define LIM 1500
     
    int main(){
    	FILE* fic;
    	fic = fopen("data", "r"); 
    	char data[LIM];
     
    	if(fic == NULL){
          printf("Impossible d'ouvrir le fichier\n");
          exit(1);
    	}
     
    	while(fgets(data, 512, fic) != NULL){
    		printf("\t%s", data);		
    	}
     
    	if(fclose(fic) == EOF) {
          printf("Probleme de fermeture du fichier \n");
          exit(1);
    	}
     
    }
    Merci d'avance pour votre aide

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut
    fread fait l'affaire ...

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Je dirais qu'il faut procéder en trois temps:

    - Déterminer la taille du fichier.
    - Allouer la mémoire nécessaire.
    - Charger le fichier en mémoire.

    Pour déterminer la taille du fichier, typiquement on l'ouvre en "rb", on se positionne à la fin grâce à fseek et on lit la position grâce à ftell , on a ainsi la taille. ensuite on se repositionne au début du fichier grâce à rewind et on passe à l'étape 2.

    A+

    Pfeuh

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Sous Unix/Linux:
    • ouvrir le fichier et récupérer sa taille (open,fstat)
    • mapper le fichier en mémoire (mmap)
    • fermer le fichier (close)
    ɹǝsn *sıɹɐlos*

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Sous Unix/Linux:
    • ouvrir le fichier et récupérer sa taille (open,fstat)
    • mapper le fichier en mémoire (mmap)
    • fermer le fichier (close)
    Pourquoi vouloir utiliser des fonctions spécifiques à Linux alors qu'il existe des fonctions portables et bien plus efficaces ?

    Ensuite si je ne dis pas de bêtise, fstat ne va pas donner la taille exacte du fichier, il va donner la taille de l'espace où est stocké le fichier.

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pourquoi vouloir utiliser des fonctions spécifiques à Linux
    Il ne s'agit pas d'une fonction spécifique à Linux.
    alors qu'il existe des fonctions portables
    Ok, mmap n'est pas ANSI C mais mmap est portable dans le sens où il est standardisé par POSIX et disponible sur la plupart des OS courants qui implémentent la mémoire virtuelle. la seule exception notable est Windows où une fonctionnalité similaire est proposée: CreateFileMapping/MapViewOfFile
    et bien plus efficaces ?
    Une fonction portable n'est pas nécessairement plus efficace. Dans le cas particulier de mmap, il s'agit en général au contraire de la méthode la plus rapide et la plus efficace pour lire un fichier. Il y a bien sûr des limitations et des cas où mmap n'est pas approprié, par exemple s'il ne s'agit pas d'un "vrai fichier" ou si son contenu et sa taille sont modifiés après coup.
    Ensuite si je ne dis pas de bêtise, fstat ne va pas donner la taille exacte du fichier, il va donner la taille de l'espace où est stocké le fichier.
    Non. fstat donne un ensemble d'informations dont la taille exacte du fichier (delta entre le premier octet et l'offset du dernier octet du fichier), et la taille nécessaire au stockage du fichier, en nombre de blocs (st_blocks). C'est bien sûr la première valeur (st_size) qu'il faut utiliser pour mmap.
    ɹǝsn *sıɹɐlos*

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Il ne s'agit pas d'une fonction spécifique à Linux.Ok, mmap n'est pas ANSI C mais mmap est portable dans le sens où il est standardisé par POSIX et disponible sur la plupart des OS courants qui implémentent la mémoire virtuelle.
    Pour moi être portable, c'est être disponible sur tous les OS même Windows, ie norme C89, C99, ...

    Citation Envoyé par jlliagre Voir le message
    Une fonction portable n'est pas nécessairement plus efficace. Dans le cas particulier de mmap, il s'agit en général au contraire de la méthode la plus rapide et la plus efficace pour lire un fichier.
    Je pensais surtout à open et à close.

    Citation Envoyé par jlliagre Voir le message
    Non. fstat donne un ensemble d'informations dont la taille exacte du fichier (delta entre le premier octet et l'offset du dernier octet du fichier), et la taille nécessaire au stockage du fichier, en nombre de blocs (st_blocks). C'est bien sûr la première valeur (st_size) qu'il faut utiliser pour mmap.
    Autant pour moi alors.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pour moi être portable, c'est être disponible sur tous les OS même Windows, ie norme C89, C99, ...
    Pour moi aussi, je n'ai rien contre la normalisation du C, bien au contraire. Ma suggestion n'avait pas la prétention d'être portable sur tous les OS ayant précisé "sous Unix/Linux".
    Je souhaitais juste proposer une alternative peu connue mais potentiellement intéressante bien que peut-être hors-sujet sur le forum "Débuter" ...
    ɹǝsn *sıɹɐlos*

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Pour moi aussi, je n'ai rien contre la normalisation du C, bien au contraire. Ma suggestion n'avait pas la prétention d'être portable sur tous les OS ayant précisé "sous Unix/Linux".
    Je souhaitais juste proposer une alternative peu connue mais potentiellement intéressante bien que peut-être hors-sujet sur le forum "Débuter" ...
    Ca t'apprendra à ne pas faire un roman explicatif…
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Récupérer le contenu d'un fichier texte dans une variable
    Par heureactuelle dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/05/2008, 15h10
  2. Réponses: 1
    Dernier message: 18/04/2007, 18h13
  3. contenu d'un fichier texte dans un tableau
    Par lyoram dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 30/11/2006, 11h15
  4. Réponses: 8
    Dernier message: 06/08/2006, 15h11
  5. Réponses: 3
    Dernier message: 19/05/2006, 11h35

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