Partage
  • Partager sur Facebook
  • Partager sur Twitter

fwrite et l'ecrasement de données [C/C++]

Sujet résolu
    8 novembre 2018 à 20:25:06

    Bonjour à tous,

    Je solicite votre aide car je suis en BTS SN 1 option IR, que je bloque sur un probleme et que mon prof d'info sera absent pour une durée indeterminer.

    J'ai un fichier binaire ecris à l'aide de fwrite contenant deux choses:

    -un nombre representant le nombre de données (structure en locurence) inscrite dans le fichier,

    -les différentes structures.

    Et mon probleme est que quand je rajoute une structure (et donc que je doit modifier le nombre en debut de doc) je n'arrive pas à "ecraser" le nombre ecrit et le remplacer par le nouveau (en utilisant fseek ou rewind meme resultat), je me suis apercut en faisant un autre code a cotes pour essayer de comprendre que quoi qu'il arrive fwrite écrivais a la fin du document.

    Le code:

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    #include <stdio.h>
    #include <conio.h>
    
    #include <alloc.h>
    
    //---------------------------------------------------------------------------
    
    const char fileName[20] = "liste.struct";
    
    //---------------------------------------------------------------------------
    
    struct Fiche{
        char nom[20];
        char prenom[20];
        int age;
        char sexe;
    };
    
    //---------------------------------------------------------------------------
    
    //int how();
    
    void init(Fiche* fiches);
    void ecriture(Fiche* fiches);
    void lecture(Fiche* fiches);
    
    //---------------------------------------------------------------------------
    
    int main(int argc, char* argv[])
    {
        struct Fiche* fiches;
        fiches = (Fiche*)malloc(10*sizeof(Fiche));
        int action;
    
        init(fiches);
    
        puts("Voulez vous ecrire ou lire le fichier? [1/2]");
        scanf("%d", &action);
    
        switch(action)
        {
            case 1:
                ecriture(fiches);
                break;
    
            case 2:
                lecture(fiches);
                break;
    
            default:
                puts("INPUT ERROR");
                break;
        }
    
        puts("Pour continuer frapper une touche");
        getch();
    
        free(fiches);
    
        return 0;
    }
    
    void init(Fiche* fiches)
    {
        FILE* fichier = fopen(fileName, "r");
        int nbr = 0;
    
        if(fichier != NULL)
        {
          fread(&nbr, sizeof(int), 1, fichier);
    
          for(int i = 0; i < nbr; i++)
          {
             struct Fiche buffer;
             fread(&buffer, sizeof(Fiche), 1, fichier);
    
             *(fiches+i) = buffer;
             printf("%s | %s | %d | %c\n", buffer.nom, buffer.prenom, buffer.age, buffer.sexe);
          }
        }
        else
        {
          fichier = fopen(fileName, "w");
          fwrite(&nbr, sizeof(int), 1, fichier);
        }
        fclose(fichier);
    }
    
    void ecriture(Fiche* fiches)
    {
        int nbr;
        int nbrStruct;
        FILE* fichier = fopen(fileName, "a+");
    
        printf("combien de structure aller vous remplir?");
        scanf("%d", &nbr);
    
        struct Fiche tampon;
    
        if(fichier != NULL)
        {
          fseek(fichier, 0, SEEK_SET);
          fread(&nbrStruct, sizeof(int), 1, fichier);
          fseek(fichier, nbrStruct, SEEK_CUR);
    
          for(int i = 0; i < nbr; i++)
          {
             clrscr();
             printf("Structure %d.\n", i+1);
             printf("Nom: ");
             flushall();
             gets(tampon.nom);
             printf("Prenom: ");
             gets(tampon.prenom);
             printf("Age :");
             scanf("%d", &(tampon.age));
             printf("Sexe : ");
             flushall();
             scanf("%c",&(tampon.age));
    
             fwrite(&tampon, sizeof(Fiche), 1, fichier);
             *(fiches+nbrStruct) = tampon;
             nbrStruct++;
             fseek(fichier, 0,SEEK_SET);
             fwrite(&nbrStruct, sizeof(int), 1, fichier);
             fseek(fichier, nbrStruct, SEEK_CUR);
          }
        }
    
        fclose(fichier);
    }
    
    void lecture(Fiche* fiches)
    {
       FILE* fichier = fopen(fileName, "r");
       int nbrStruct;
       struct Fiche buffer;
    
       if(fichier != NULL)
       {
          fread(&nbrStruct, sizeof(int), 1, fichier);
          printf("Il y a %d struct\n", nbrStruct);
    
          for(int i = 0; i < nbrStruct; i++)
          {
             fread(&buffer, sizeof(Fiche), 1, fichier);
             printf("%s | %s | %d | %c\n", buffer.nom, buffer.prenom, buffer.age, buffer.sexe);
          }
       }
    
       fclose(fichier);
    }
    
    /*int how();
    {
       FILE* fichier = fopen(fileName, "r");
       int retour;
    
       if(fichier != NULL)
       {
          fread(&retour, sizeof(int), 1, fichier);
          fclose(fichier);
       }
       else
          puts("OPENING ERROR");
    
       return retour;
    }*/
    //---------------------------------------------------------------------------
     

    La partie posant probleme:

    fwrite(&tampon, sizeof(Fiche), 1, fichier);
    *(fiches+nbrStruct) = tampon;
    nbrStruct++;
    fseek(fichier, 0,SEEK_SET);
    fwrite(&nbrStruct, sizeof(int), 1, fichier); //C'est cette ligne qui modifie le nombre
    fseek(fichier, nbrStruct, SEEK_CUR);

    et le code "bidon" qui m'a servie pour la remarque

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    #include <stdio.h>
    #include <conio.h>
    
    int main(int argc, char* argv[])
    {
      FILE* fichier = fopen("test.txt", "a");
      int nbr = 0;
      if(fichier != NULL)
      {
        fwrite(&nbr, sizeof(int),1,fichier);
        rewind(fichier);
        nbr++    ;
        fwrite(&nbr, sizeof(int),1,fichier);
      }
      fclose(fichier);
    
      return 0;
    }
    //---------------------------------------------------------------------------
    


    Pour lire le fichier binaire j'utilise SublimeText qui affiche le code hexadecimal (rappel int = 4 octets et 1 octet en hewa = 2 bits)

    Merci à toute les personnes qui se pencherons sur ce cas (PS: j'ai fait des recherches internet et je n'ai trouver aucun probleme similaire)

    -
    Edité par GwenaelGuiraud 8 novembre 2018 à 20:27:57

    • Partager sur Facebook
    • Partager sur Twitter
      8 novembre 2018 à 22:07:11

      Bonjour,

      Le fichier est ouvert en mode "a+", vérifie bien les modes possibles. "a" veux dire "append" donc des ajouts seulement et l'absence de "b" risque de ne fonctionner nulle part sauf sous Linux. Pour un accès écriture de données binaires, je te propose plutôt d'utiliser "r+b", pour le lire "rb" et pour une première création "wb" ou "w+b".

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        9 novembre 2018 à 9:29:34

        Salut,

        Si tu veux écrire dans un fichier en C++, oublie fopen, fwrite et autres ; utilise std::ofstream, qui est bien plus simple d'utilisation.

        -
        Edité par Emrak 9 novembre 2018 à 9:29:53

        • Partager sur Facebook
        • Partager sur Twitter
          9 novembre 2018 à 11:28:50

          Je pense que l'OP n'a pas posté sur le bon forum.
          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2019 à 12:39:17

            Merci à tous j'avais un peu oublier le post ^^" j'en suis desoler...

            Quand a ce qui concerne mon probleme j'en ai trouver la solution et concernant std::ofstream y a deux raisons:

            1. j'etais en C

            2. mon prof m'a demander de pas aller plus vite que la musique et il est du style à enquiquiner donc plutôt que de me prendre la tete avec lui je continue fopen.

            Merci à tous.

            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2019 à 13:25:30

              Bonjour,

              Mauvais forum

              Le sujet est déplacé de la section Langage C++ vers la section Langage C

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

              fwrite et l'ecrasement de données [C/C++]

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown