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 :

[File] récupérer le contenu d'un fichier


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Points : 180
    Points
    180
    Par défaut [File] récupérer le contenu d'un fichier
    Comment lire un fichier et le mettre dans une chaine de caractère ?

    actuellement , j'ai :

    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
    FILE* fSrc;
    char buffer[512];
    int NbLu;
    char * content=NULL;
    long savepos = 0, size = 0;
     
    if((fSrc=fopen(filename, "r")) != NULL)
    {
     
     
    	savepos = ftell(fSrc);          // sauvegarder la position
    	fseek(fSrc, 0, SEEK_END);       // aller en fin 
    	size = ftell(fSrc);             // lire la taille 
    	fseek(fSrc, savepos, SEEK_SET); // rétablir la position 
     
    	// alloc
    	content = malloc((size*8)+1);
     
    	while((NbLu=fread(buffer, 1, 512, fSrc)) != 0)
    	{
    		//strcat(content, buffer);
    	}
     
    	fclose(fSrc);
    }
    content[size+1] = '\0';
    Cela vous parait-il correct ?
    Notamment le content = malloc((size*8)+1);
    (un char = 8 bit ... donc)

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content = malloc((size*8)+1);
    à remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content = malloc(size+1);
    pas besoin de ton "*8". malloc reserve des cases mémoires et une case mémoire peut contenir un "char" (pour faire simple). taille d'une case <=> taille d'un char.

    ça te va ?
    sinon j'ai pas tout regardé, mais le mieu c'est déjà de tester avec ça et de voir ce que ça donne ;-)

    (oubli pas de libérer la mémoire )
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    est ce que tu sais à l'avance ce que tu vas lire, genre un tableau de donnée (dont tu connais la taille).... ?

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((fSrc=fopen(filename, "r")) != NULL)
    Tu manque de place ? Autant le mettre sur deux ligne c'est plus lisible.

    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	savepos = ftell(fSrc);          // sauvegarder la position
    Inutile, le curseur est placé au début du fichier lors de son ouverture (utilise fseek pour y retourner)

    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	content = malloc((size*8)+1);
    malloc peut échouer (comme fopen)

    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	while((NbLu=fread(buffer, 1, 512, fSrc)) != 0)
    Si c'est un fichier texte autant utiliser fgets
    Citation Envoyé par kendras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		//strcat(content, buffer);
    Commenté ça marche moins bien
    De plus au premier tour de boucle content c'est pas initialisé.

    Astuce du jour : pour poster du code, les balises [code][/code] ça permet de garder l'indentation

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Si c'est un fichier texte autant utiliser fgets
    Oui mais dans ce cas on ne peut pas bufferiser en un coup.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    Citation Envoyé par seriousme
    Oui mais dans ce cas on ne peut pas bufferiser en un coup.
    et bien si c'est du texte il est plus simple d'utiliser fgets, tu stokes ligne par ligne, le princi est le meme mais en plus simple, et dans ce cas tu boucles avec un feof() ou plutot sur un fgets(...)!=NULL. http://www.lri.fr/~aze/page_c/aide_c/

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par seriousme
    Oui mais dans ce cas on ne peut pas bufferiser en un coup.
    Même avec fread ce n'est pas le cas ici (et puis demander à fread de lire 10 Mo ça me fait peur )

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Avec "fread" si on connait la taille exact du fichier on peut tout lire d'un coup dans le buffer, non?
    Alors que "fgets" impose de boucler sur chaque ligne.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    question, les \n sont comptés dans les fseek?

  10. #10
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par seriousme
    Avec "fread" si on connait la taille exact du fichier on peut tout lire d'un coup dans le buffer, non?
    Alors que "fgets" impose de boucler sur chaque ligne.
    Oui mais dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((NbLu=fread(buffer, 1, 512, fSrc)) != 0)
    La lecture est limitée à 512 octects. Et si ton fichier fait plusieurs Mo tu vas lui demander de tout lire d'un coup

    Citation Envoyé par reptils
    question, les \n sont comptés dans les fseek?
    Oui c'est un caractère comme un autre.

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Oui mais dans le code :
    Ah, OK, je parlais en général.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    de toute façon fread s'utilise lorsqu'on a utilisé un fwrite pour avoir ecrit le fichier non?

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pas forcément.
    C'est juste que "fread" lit en "brut", les bytes, et "fgets" lit des lignes de caractères.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par reptils
    question, les \n sont comptés dans les fseek?
    Surtout que leur taille varie selon les systèmes...
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Avec "fread" si on connait la taille exact du fichier on peut tout lire d'un coup dans le buffer, non?
    Alors que "fgets" impose de boucler sur chaque ligne.
    Et, c'est grave ?
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Pas forcément.
    C'est juste que "fread" lit en "brut", les bytes, et "fgets" lit des lignes de caractères.
    Nan ! Déjà expliqué souvent. Ce n'est pas la fonction qui fait le caractère brut ou pas, mais le mode d'ouverture :
    • "r" : "cooked" (interprété ou 'texte')
    • "rb" : "raw" (brut ou binaire)
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    OK, quelle est la différence entre ouvrir le fichier en brut ou interprété puis lire avec "fread"?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    OK, quelle est la différence entre ouvrir le fichier en brut ou interprété puis lire avec "fread"?
    Sous DOS/Windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Caractère | Brut       | Interprété |
    '\n'      | 0x13 0x10  | 0x10       |
    ^Z        | ignoré     | EOF        |
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    D'accord, et si on l'ouvre en binaire et qu'on fait un "fgets"?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    D'accord, et si on l'ouvre en binaire et qu'on fait un "fgets"?
    Il y aura problement un CR en plus du LF...
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/02/2007, 18h44
  2. Réponses: 5
    Dernier message: 10/04/2006, 12h07
  3. Aide : Décoder, récupérer le contenu d'un fichier .pst
    Par ATTIA dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 23/03/2006, 16h11
  4. Comment récupérer le contenu de plusieurs fichiers textes ?
    Par calimero2611 dans le forum Langage
    Réponses: 9
    Dernier message: 19/02/2006, 15h45
  5. [ethereal] récupérer le contenu d'un fichier envoyé ?
    Par in dans le forum Développement
    Réponses: 1
    Dernier message: 19/06/2005, 15h44

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