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 :

Problème lecture écriture par bloc dans un fichier


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème lecture écriture par bloc dans un fichier
    bonsoir,

    Voici mon problème, j'écrit des données dans un fichier texte avec fwrite () puis les lis avec fread (), jusque là pas de problème tout marche bien, seulement voila ce que je lis n'est pas ce que j'ai écrit et je n'arrive pas à voir si cela vient de l'écriture ou de la lecture ou bien des deux. Voici mes fonctions d'écriture:

    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
    void ecrireSeq(FILE *f, sequence s)
    {
        char buff = 0;
        size_t n = CHAR_BIT;
     
        while (s != NULL)
        {
            buff <<= 1;
            buff |= s->data;
            n--;
     
            if (n == 0)
            {
                fwrite(&buff, sizeof buff, 1, f);
                n = CHAR_BIT;
            }
            s = s->suivant;
        }
     
        if (n != 0)
        {
            fwrite(&buff, sizeof buff, 1, f);
        }
     
        return;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void ecrireLst(FILE *f, liste l)
    {
        while (l != NULL)
        {
            if (fwrite(&l->data, sizeof l->data, 1, f) != 1)
            {
                fputs("ecrireLst: Echec d'ecriture", stderr);
                exit(1);
            }
            l = l->suivant;
        }
     
        return;
    }
    Mes fonctions de lecture:

    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
    sequence bufftoseq(FILE *f)
    {
        sequence res = NULL;
        char buff = 0;
     
        while (fread(&buff, sizeof buff, 1, f) == 1)
        {
            int i = CHAR_BIT - 1;
     
            for ( ; i >= 0; i--)
            {
                inserer_apres(&res, buff & 1UL << i);
            }
        }
     
        if (feof(f) == 0)
        {
            fputs("bufftoseq: Echec de lecture", stderr);
            exit(1);
        }
     
        return res;
    }
    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
    liste lireLst(FILE *f, size_t n)
    {
        liste res = NULL;
        size_t i = 0;
        arbrepoids a;
     
        for ( ; i < n; i++)
        {
            if (fread(&a, sizeof a, 1, f) != 1)
            {
                libere_listeEntiere(&res);
                fputs("lireLst: Echec de lecture", stderr);
                exit(1);
            }
            res = creer_liste(a, res);
        }
     
        return res;
    }
    Si vous avez besoin d'autres parties du programme pour mieux comprendre n'hésitez pas. Merci d'avance

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    En effet, il faudrait au moins le tête de la liste chainée utilisée.

    Sinon,
    • Les fichiers sont ils bien ouverts en mode binaire ?
    • Qu'enregistres tu dans ces fichiers ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Ok alors voici les 4 structures utilisées dans ces bout de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct liste {
    	arbrepoids data;
    	struct liste *suivant; 
    } *liste;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	arbre element; 
    	int poids;
    } arbrepoids;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct charArbre
    {
            char data;
            struct charArbre *gauche;
            struct charArbre *droite; 
    } *arbre;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct listeBinaire
    {
        int data;                
        struct listeBinaire *suivant; 
    } *sequence;
    Et puis oui je les ouvres bien en mode binaire, "rb" pour le fichier d'entré et "wb" pour le fichier de sortie.
    Ensuite voici ce que je cherche à faire:
    - j'ai une liste chaîné dont chaque membre contient un arbre ainsi qu'un entier. (de cette forme ("arbre","entier")). Ensuite j'ai une autre liste chaîné dont chaque membre ne contient que 0 ou 1. Ensuite je voudrais écrire dans le fichier de sortie le nombre de couple de ma liste "liste" (cette opération est faite dans la fonction principale), et ensuite transformé ma liste de 0 et de 1 en buffer que j'écris aussi dans le fichier. Pour la lecture je lis ce que j'ai marquer pour l'écrire dans un autre fichier, je fais donc la procédure inverse.

    En espérant avoir été assez clair.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Alors, quand tu enregistre une liste, tu enregistre directement un arbrepoids, dans lequel on trouve un arbre ... tu enregistres donc directement dans le fichiers les champ struct charArbre * : gauche et droite.

    Au final, tu enregistres dans le fichier des adresses mémoires qui pointent vers ce que tu voudrais enregistrer en vrai. Pour illustrer, tu enregistres un raccourci au lieu d'enregistrer un fichier.

    Tu ne vas pas pouvoir enregistrer un arbre si facilement dans un fichier : il faut que tu définisses un format de fichier que les fonctions d'enregistrement et de lecture devront respecter.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Ok alors si j'ai bien compris ce que tu m'as dit (surtout n'hésite pas à me dire si je me trompe) au lieu d'enregistrer mes données elles mêmes j'enregistre que les adresses, non ?

    Pourtant lorsque je lit la liste est bien la bonne (sauf pas dans le bon ordre) et la séquence que j'ai enregistrer par contre n'a ni queue ni tête.

    Donc d'après toi il faudrait que je fasse un format, mais je ne vois pas lequel sans changer les types et le fonctionnement ce que je ne voudrais pas, aurais-tu une idée ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Merci beaucoup le problème était bien celui que tu m'avais dit et j'ai donc pu le résoudre

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/03/2011, 14h36
  2. Réponses: 1
    Dernier message: 07/10/2010, 13h14
  3. Réponses: 4
    Dernier message: 20/04/2010, 16h28
  4. lecture par blocs dans un fichier avec marqueur
    Par cheikh_tk dans le forum C
    Réponses: 3
    Dernier message: 06/06/2006, 16h39
  5. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15

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