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

MFC Discussion :

Comment enregistrer un stream de longueur fixe ?


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Comment enregistrer un stream de longueur fixe ?
    Bonjour,
    J'ai un problème d'enregistrement de donnée a vous soumettre.
    Je dois enregistrer des données 'byte - int - long' dans un fichier séquentiel. La longueur totale d'une trame est de 759 byte. Or lors de la lecture des trames je n'obtient pas le résultat excompté, pire j'ai des blanc qui s'ajoute dans les premiers paquets de données.
    Il ya donc quelque chose que je n'ai pas compris ou oublier , Pouvez vous m'aider et m'expliquer pourquoi?

    voici la partie du code simplifiée que j'utilise pour enregister le stream.

    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
    FILE* stream;
    BYTE buff[8];
    int  numwritten ,data1;
    long data2;
    data1 =100;
    data2 =200;
    fpos_t pos=0;
     
    for ( int i = 0; i < 8; i++ )
             buff[i] = (BYTE) i;
    if( (stream = fopen( "file.dat", "w" )) != NULL )
      {
         for ( int i = 0; i < 200; i++ ) // par exemple
        {
           fsetpos( stream, &pos );
           numwritten = fwrite( &buff, sizeof( buff), 4, stream );
           numwritten = fwrite( &data1 , 1, 1, stream );
           numwritten = fwrite( &data2 , 1, 1, stream );
          /* 
           plus les autre champ pour obtenir 759 bytes
           */
     
           fgetpos( stream, &pos );
      }
         fclose( stream );
     }
       else
          printf( "Problem opening the file\n" );
    Y a t'il un longueur minimale pour le premier record ou ???
    Je vous remercie pour votre aide

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    N'oubliez pas de travaillez avec un fichier ouvert en binaire dans ce cas
    "wb" pour ecrire "rb" pour lire car en mode texte certains caracteres
    sont automatiquement converti a l'ecriture dans fichier( exemple: le LF -> CRLF).

    De plus dans le code Data1 et Data2 vous n'ecrivez que leur 1er byte
    il faut respectivement sizeof(int) et sizeof(long)

    Salut

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    merci ceci me résoud une paryie de mon problème reste a voir pourquoi j'ai un blanc entre la premiere trame de byte et 2048 ... , mais je ne l'ai pas régulièrement !!! s'agit - il d'un buffer d'écriture par défaut ?

    De plus dans le code Data1 et Data2 vous n'ecrivez que leur 1er byte
    il faut respectivement sizeof(int) et sizeof(long)
    tout a fait d'acord (un oublis de retranscription)
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         numwritten = fwrite( &data1 , sizeof(int) , 1, stream ); 
          numwritten = fwrite( &data2 , sizeof(long), 1, stream );
    merci pour la correction

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Il y a un autre probleme,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numwritten = fwrite( &buff, sizeof( buff), 4, stream );
    Dans ce cas, sizeof(buff) == 8 et vous avez mis 4 comme 3eme argument
    pour fwrite cela signifie ecrire a partir de l'adresse de buff 8*4 bytes
    ==> 32 bytes donc il ecrit les 8 bytes de buff puis il ecrit 24 bytes
    de la memoire qui suit (bytes qui se trouvent dans la pile puisque
    variable locale) a l'ecriture ce n'est pas encore trop grave mais si vous
    faites pareil a la lecture il peut y avoir des effets de bord tout a fait
    etonnant.

    Salut

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Aiee voila nom problème.
    Alors dites moi comment je dois m'y prendre pour pouvoir enregistrer les 4 premiers bytes du buffer ?
    j'ai suivit l'exemple suivant fournis avec vc++

    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
      FILE *stream;
       char list[30];
       int  i, numread, numwritten;
     
       /* Open file in text mode: */
       if( (stream = fopen( "fread.out", "w+t" )) != NULL )
       {
          for ( i = 0; i < 25; i++ )
             list[i] = (char)('z' - i);
          /* Write 25 characters to stream */
          numwritten = fwrite( list, sizeof( char ), 25, stream );
          printf( "Wrote %d items\n", numwritten );
          fclose( stream );
     
       }
       else
          printf( "Problem opening the file\n" );
    Je vous remercie pour votre aide

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Ok mon exemple est fonctionnel et donc mon problème résolut.

    Voici la correction appliquée et son explication

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //on enregistre les 4 premiers bytes
    numwritten = fwrite( &buff, sizeof( BYTE), 4, stream );
    numwritten = fwrite( &data1 , sizeof(int), 1, stream );
    numwritten = fwrite( &data2 , sizeof(long), 1, stream );
    //on enregistre les 4 bytes suivant le 2éme byte
    numwritten = fwrite( &buff[2], sizeof( BYTE), 4, stream );
    Comme quoi il est important de lire les pages help j'usqu'a la fin
    Merci

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

Discussions similaires

  1. [2008R2] Comment faire un fichier plat longueur fixe avec SQL 2008R2
    Par Goofy95 dans le forum Outils
    Réponses: 0
    Dernier message: 06/10/2013, 17h17
  2. Réponses: 1
    Dernier message: 20/11/2008, 12h36
  3. enregistrements de longueur fixe
    Par VINCENTNINI dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/01/2008, 06h35
  4. Réponses: 9
    Dernier message: 13/10/2006, 15h39
  5. Réponses: 16
    Dernier message: 22/03/2005, 21h57

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