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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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 �prouv�

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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 �prouv�

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 20
    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