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 :

Lecture et écriture de blocs


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut Lecture et écriture de blocs
    Bonjour
    Je suis étudiant en informatique et on vient de nous introduire aux entrées/sorties et disons que je suis un peu perdu. Pourriez vous m'expliquer ce code svp.

    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
    29
    30
    31
     
    #include <stdio.h>
     
    #define NbElt ( t ) ( sizeof t / sizeof t [0] )
     typedef struct { 
     int n ;
     float t [10] ;
     char c ;
     } Donnee ;
     
     int main(int argc , char *argv [ ] ) { 
     Donnee s1 = { 1 , { 1. , 2. , 3.} , ’a’};
     Donnee s2 [ ] = { {4, {10. , 32. , 3.} , ’z’}, {5, { 2. , 11. , 2. , 4.} , ’h’} };
     FILE *f , *f_sauve ; Donnee s ;
     
     if ( ( f = fopen("donnee" , "w" ) ) == NULL)
     perror("fopen") , exit ( 1 ) ;
     fwrite(&s1 , sizeof(Donnee) , 1 , f ) ;
     fwrite( s2 , sizeof(Donnee) , NbElt(s2) , f ) ;
     fclose(f ) ;
     if ( ( f = fopen("donnee" , "r" ) ) == NULL || 
     (f_sauve = fopen("sauvegarde" , "w" ) ) == NULL)
     perror("fopen") , exit ( 2 ) ;
     fread(&s , sizeof(Donnee) , 1 , f ) ;
     while ( ! feof(f ) )
     { 
     fwrite(&s , sizeof(Donnee) , 1 , f_sauve ) ;
     fread(&s , sizeof(Donnee) , 1 , f ) ;
     }  fclose(f ) ;
     fclose(f_sauve ) ;
     }
    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par incognito86
    Bonjour
    Je suis étudiant en informatique et on vient de nous introduire aux entrées/sorties et disons que je suis un peu perdu. Pourriez vous m'expliquer ce code svp.
    Si tu nous disais précisément ce que tu ne comprends pas, cela nous permettrait de t'aider sans tout traduire en français...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut
    On n'a pas encore vu typedef donc j'aimerais bien savoir quel son role . Je ne comprends pas pourquoi Donnee de trouve un peu perdu au mlieu des lignes .
    Quelle est la différence entre s1 et s2 . s1 enum et s2 tableau ?
    J'arrive à comprendre certaines lignes mais pas tout le bloc

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par incognito86
    Bonjour
    Je suis étudiant en informatique et on vient de nous introduire aux entrées/sorties et disons que je suis un peu perdu. Pourriez vous m'expliquer ce code svp.
    Déjà, il ne compile pas...
    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
    29
    30
    31
    32
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:12: error: stray '\146' in program
    main.c:12: error: stray '\146' in program
    main.c:12: error: `a' undeclared (first use in this function)
    main.c:12: error: (Each undeclared identifier is reported only once
    main.c:12: error: for each function it appears in.)
    main.c:12: warning: missing initializer
    main.c:12: warning: (near initialization for `s1.c')
    main.c:13: error: stray '\146' in program
    main.c:13: error: stray '\146' in program
    main.c:13: error: `z' undeclared (first use in this function)
    main.c:13: warning: missing initializer
    main.c:13: warning: (near initialization for `s2[0].c')
    main.c:13: error: stray '\146' in program
    main.c:13: error: stray '\146' in program
    main.c:13: error: `h' undeclared (first use in this function)
    main.c:13: warning: missing initializer
    main.c:13: warning: (near initialization for `s2[1].t')
    main.c:17: warning: implicit declaration of function `exit'
    main.c:19: error: `t' undeclared (first use in this function)
    main.c: At top level:
    main.c:11: warning: unused parameter 'argc'
    main.c:11: warning: unused parameter 'argv'
    Process terminated with status 1 (0 minutes, 1 seconds)
    12 errors, 9 warnings
    Ensuite, il est horriblement mal présenté. Il faut indenter son code.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <stdio.h>
     
    #define NbElt ( t ) ( sizeof t / sizeof t [0] )
     
    typedef struct
    {
       int n;
       float t[10];
       char c;
    }
    Donnee;
     
    int main (int argc, char *argv[])
    {
       Donnee s1 = { 1, {1., 2., 3.}, ’a ’ };
       Donnee s2[] = { {4, {10., 32., 3.}, ’z ’}, {5, {2., 11., 2., 4.}, ’h ’} };
       FILE *f, *f_sauve;
       Donnee s;
     
       if ((f = fopen ("donnee", "w")) == NULL)
          perror ("fopen"), exit (1);
       fwrite (&s1, sizeof (Donnee), 1, f);
       fwrite (s2, sizeof (Donnee), NbElt (s2), f);
       fclose (f);
       if ((f = fopen ("donnee", "r")) == NULL ||
           (f_sauve = fopen ("sauvegarde", "w")) == NULL)
          perror ("fopen"), exit (2);
       fread (&s, sizeof (Donnee), 1, f);
       while (!feof (f))
       {
          fwrite (&s, sizeof (Donnee), 1, f_sauve);
          fread (&s, sizeof (Donnee), 1, f);
       }
       fclose (f);
       fclose (f_sauve);
    }
    On y voit déjà plus clair... Je tente un commentaire :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdio.h>
    #include <stdlib.h> /* -ed- ajoute pour exit() */
     
    /* -ed- cette macro calcule le nombre d'elements d'un tableau */
    #define NbElt(t) (sizeof t/sizeof t[0])
     
    /* -ed- une structure de donnees quelconques pour illustrer l'exemple */
    typedef struct
    {
       int n;
       float t[10];
       char c;
    }
    Donnee;
     
    int main (int argc, char *argv[])
    {
     
       /* -ed- des donnees initialises pour l'exemple, je suppose...
     
       Atention ’a ’ n'existe pas. C'est 'a'
     
       */
       Donnee s1 = { 1, {1., 2., 3.}, 'a' };
       Donnee s2[] = { {4, {10., 32., 3.}, 'z'}, {5, {2., 11., 2., 4.}, 'h'} };
       FILE *f, *f_sauve;
       Donnee s;
     
    /* -ed- ouverture du fichier "donnees" en ecriture texte */
       if ((f = fopen ("donnee", "w")) == NULL)
          perror ("fopen"), exit (1);
     
    /* -ed- enregisrement des donnes au format 'raw' (brut).
        Attention, non portable, surtout en mode 'texte'*/
       fwrite (&s1, sizeof (Donnee), 1, f);
       fwrite (s2, sizeof (Donnee), NbElt (s2), f);
     
    /* -ed- enregistrement termine, on ferme le fichier. */
       fclose (f);
     
    /* -ed- maintenant, on ouvre un fichier en mode lecture texte
        et l'autre en mode ecriture texte.
     
        c'est un peu horrible comme codage et surtout tres illisible... 
    */
       if ((f = fopen ("donnee", "r")) == NULL ||
           (f_sauve = fopen ("sauvegarde", "w")) == NULL)
          perror ("fopen"), exit (2);
     
       /* -ed- lecture des donnees */   
       fread (&s, sizeof (Donnee), 1, f);
     
       /* -ed- buf : feof() ne fait pas le test de fin de fichier. 
       Il faut tester la fonction de lecture... */
       while (!feof (f))
       {
          /* -ed- ecriture */
          fwrite (&s, sizeof (Donnee), 1, f_sauve);
          /* -ed- lecture */
          fread (&s, sizeof (Donnee), 1, f);
       }
       /* -ed- On a pas ecrit le dernier bloc. C'est voulu ? */
     
    /* -ed- copie termine, on ferme les fichiers. */
       fclose (f);
       fclose (f_sauve);
    }
    Pose des questions si tu ne comprends pas.

    Pas mal d'erreurs dans ce code...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut
    Salut , vous pouvez retrouver le code ici page 224

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut
    Merci pour la réponse mais je ne comprends pas le role de cette boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (!feof (f))
       {
          /* -ed- ecriture */
          fwrite (&s, sizeof (Donnee), 1, f_sauve);
          /* -ed- lecture */
          fread (&s, sizeof (Donnee), 1, f);
       }
    Il faudrait pas faire une boucle ici ?
    Est ce que la deuxième ligne écrase la première ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* -ed- enregisrement des donnes au format 'raw' (brut).
        Attention, non portable, surtout en mode 'texte'*/
       fwrite (&s1, sizeof (Donnee), 1, f);
       fwrite (s2, sizeof (Donnee), NbElt (s2), f);
    Finalement ,désolé mais je n'ai toujours pas compris le role du code (recopier f dans f_sauve ? )

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par incognito86
    Finalement ,désolé mais je n'ai toujours pas compris le role du code (recopier f dans f_sauve ? )
    Apparemment, créer un fichier, puis le recopier dans un autre. Mais, c'est mal fait et la dernière structure n'est pas copiée.

    Mais, bon, on est pas dans la tête du concepteur, on ne connait pas ses intentions...

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    Revenir en avant comme en arrière d'une table:
    vous oubliez fseek(...) ;

    Salut.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dj.motte
    Revenir en avant comme en arrière d'une table:
    vous oubliez fseek(...) ;
    C'est vachement pas clair ce que tu dis là... C'est crypté ?

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    Au juger des réponses des petits pinailleurs, je ne vais pas m'aventurer.

    Il y a eu toutefois deux aventures pour écrire les données, sans toutefois pouvoir les récupérer.

    Salut.

  11. #11
    Membre confirmé Avatar de amine6441
    Inscrit en
    Novembre 2006
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 85
    Par défaut
    salut mon ami
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct { 
     int n ;
     float t [10] ;
     char c ;
     } Donnee ;

    ba le typedef struct
    ce sont des enregistrements
    ba dans une fonction ou procedure vous n'allez pas declarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int n;
    float t[10];
    char c;
    vous allez juste declarer donner par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exemple(dnnee d){
    scanf("%d",&d.n);
    scanf("%c",&d.c);
    }
    et merci

Discussions similaires

  1. Problème lecture écriture par bloc dans un fichier
    Par scary dans le forum Débuter
    Réponses: 5
    Dernier message: 22/04/2009, 19h28
  2. [Applet] Sécurité lecture et écriture
    Par ZeKiD dans le forum Applets
    Réponses: 1
    Dernier message: 18/08/2006, 11h17
  3. [VB6] lecture et écriture de fichier
    Par robert_trudel dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 12/06/2006, 14h06
  4. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30
  5. Ouvrir un fichier texte en lecture ET écriture
    Par Steph12 dans le forum C++
    Réponses: 12
    Dernier message: 17/06/2005, 08h08

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