suppression structure dans fichier

suppression structure dans fichier - C - Programmation

Marsh Posté le 16-01-2010 à 18:34:53    

Bonjour,
Je souhaite simplement supprimer une structure dans un fichier. Mais je n'ai aucune idée de comment faire.
 
J'ai vaguement essayé de faire quelque chose, j'arrive a supprimer une ligne. Mais pas une structure complete.(ce qu'il y a actuellement dans la fonction ne marche pas, je tâtonnais pour trouver la solution).

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define FFL fflush(stdin)
  5. struct ordinateur
  6. {
  7.     char type_proc[20];
  8.     char vitesse_proc[20];
  9.     char ram[20];
  10.     char HD[20];
  11.     char annee[20];
  12. };
  13. struct carnet
  14. {
  15.     struct ordinateur nbpc[50];
  16.     int compteur;
  17. };
  18. void saisie(FILE*fichier,/*FILE*fichieran,*/struct ordinateur *pc);
  19. void saisieannee(FILE*fichier,/* FILE*fichieran, */struct ordinateur *pc);
  20. void affichage(FILE*fichier);
  21. void suppression(FILE*fichier/*, struct ordinateur *pc*/);
  22. int main(void)
  23. {
  24.     FILE*fichier=NULL;
  25.     fichier=fopen("ordinateur.lst","a" );
  26.     struct ordinateur pc;
  27.     int option;
  28.     do
  29.     {
  30.         printf("\tMenu" );
  31.         printf("1: Saisie des caracteristiques d'un ordinateur.\n2: Tri des ordinateurs en fonction des annees.\n3: Affichage d'un des fichiers.\n4: Supprimer un ordinateur d'une liste." );
  32.         scanf("%d",&option);
  33.         switch (option)
  34.         {
  35.         case 1:
  36.             saisie(fichier/*,fichieran*/,&pc);
  37.             break;
  38.         case 2:
  39.             saisieannee(fichier/*,fichieran*/,&pc);
  40.             break;
  41.         case 3:
  42.             affichage(fichier);
  43.             break;
  44.         case 4:
  45.             suppression(fichier/*,&pc*/);
  46.             break;
  47.         }
  48.     }while (1);
  49.     return 0;
  50. }
  51. void saisie(FILE*fichier/*,FILE*fichieran*/, struct ordinateur *pc)
  52. {
  53.     if (fichier==NULL)
  54.         puts("probleme a l'ouverture du fichier" );
  55.     else
  56.     {
  57.         fichier=fopen("ordinateur.lst","a" );
  58.         FFL;
  59.         puts("quelle est l'annee d'achat" );
  60.         FFL;
  61.         gets((*pc).annee);
  62.         fprintf(fichier, "annee d'achat: %s\n", (*pc).annee);
  63.         FFL;
  64.         puts("quelle est le type du processeur" );
  65.         FFL;
  66.         gets((*pc).type_proc);
  67.         fprintf(fichier, "type processeur: %s\n", (*pc).type_proc);
  68.         puts("quelle est la vitesse du processeur" );
  69.         FFL;
  70.         gets((*pc).vitesse_proc);
  71.         fprintf(fichier, "vitesse proc: %s\n", (*pc).vitesse_proc);
  72.         FFL;
  73.         puts("quelle est la taille de la memoire vive" );
  74.         FFL;
  75.         gets((*pc).ram);
  76.         fprintf(fichier, "taille ram: %s\n", (*pc).ram);
  77.         FFL;
  78.         puts("quelle est la taille du disque dur" );
  79.         FFL;
  80.         gets((*pc).HD);
  81.         fprintf(fichier, "taille du disque dur: %s\n", (*pc).HD);
  82.         fclose(fichier);
  83.     }
  84. }
  85. void saisieannee(FILE*fichier/*,FILE*fichieran*/,struct ordinateur *pc)
  86. {
  87.     char chaine[5000] = "";
  88.     fichier=fopen("ordinateur.lst","r" );
  89.     if (fichier != NULL)
  90.     {
  91.         while (fgets(chaine, 5000, fichier) != NULL)
  92.         {
  93.             printf("%s", chaine);
  94.         }
  95.         fclose(fichier);
  96.     }
  97.     char year[5];
  98.     char date[20];
  99.     FFL;
  100.     puts("entrez la date" );
  101.     gets(date);
  102.     char ordi[20]="ordi";
  103.     char nfichier[20];
  104.     char lst[6]=".lst";
  105.     strcpy(nfichier,ordi);
  106.     strcat(nfichier,date);
  107.     strcat(nfichier,lst);
  108.     printf("le nom du fichier est: %s\n",nfichier);
  109.     if (strcmp(date,(*pc).annee)==0)
  110.     {
  111.         fichier=fopen(nfichier,"a" );
  112.         fprintf(fichier, "annee d'achat: %s\n", (*pc).annee);
  113.         fprintf(fichier, "type processeur: %s\n", (*pc).type_proc);
  114.         fprintf(fichier, "vitesse proc: %s\n", (*pc).vitesse_proc);
  115.         fprintf(fichier, "taille ram: %s\n", (*pc).ram);
  116.         fprintf(fichier, "taille du disque dur: %s\n", (*pc).HD);
  117.         fclose(fichier);
  118.     }
  119. }
  120. void affichage(FILE*fichier)
  121. {
  122.     char name[20];
  123.     int caractuel = 0;
  124.     puts("quel fichier voulez vous ouvrir(tapez le nom exact)" );
  125.     FFL;
  126.     gets(name);
  127.     fichier = fopen(name,"r" );
  128.     if (fichier != NULL)
  129.     {
  130.         do
  131.         {
  132.             caractuel = fgetc(fichier);
  133.             printf("%c", caractuel);
  134.         }
  135.         while (caractuel != EOF);
  136.         fclose(fichier);
  137.     }
  138. }
  139. void suppression(FILE*fichier/*,struct ordinateur *pc*/)
  140. {
  141.     int caractereActuel = 0;
  142.     char chaine[2000];
  143.     char year[20];
  144. FILE*fichier2;
  145.     fichier = fopen("ordinateur.lst", "r" );
  146.    /* puts("quelle est l'annee d'achat de l'ordinateur a supprimer?" );
  147.     FFL;
  148.     gets(year);
  149.     printf("l'annee d'achat du pc a supprimer est: %s",year);
  150. */
  151.    fichier2=fopen("tempo.lst","w" );
  152.     char ligne[256];
  153.     int i=0;
  154.     /*fgets(ligne, sizeof ligne, fichier);
  155.         printf("%s\n",ligne);
  156.         if (strcmp(year,(*pc).annee)==0)
  157.         {
  158.             fputs(ligne, fichier2);
  159.         }   */
  160.            /* while (fgets(ligne, sizeof ligne, fichier))
  161.     {
  162.         if (ligne[15] != '\n')
  163.         {
  164.           //  ligne[0]=" ";
  165.             fputs(ligne, fichier2);
  166.     }   }
  167. */
  168. struct ordinateur pc;
  169. rewind(fichier);
  170. while(fread(&pc,sizeof(pc),1,fichier) && !feof(fichier))
  171. {
  172. if(strcmp(pc.annee,"1999" )==0)
  173. {
  174. fwrite(&pc,sizeof(pc),1,fichier2);
  175. }
  176. }
  177. fclose(fichier);
  178. fclose(fichier2);
  179.     /*
  180.     char chaine[20000] = "";
  181.     char year[5];
  182.     fgets(chaine, TAILLE_MAX, fichier);
  183.     printf("%s", chaine);
  184.     fseek(f, 0L, SEEK_SET);
  185.     for(i = 0; i < year; i++)
  186.     getc(f);
  187. */
  188. }


Message édité par rag_ le 16-01-2010 à 18:44:03
Reply

Marsh Posté le 16-01-2010 à 18:34:53   

Reply

Marsh Posté le 16-01-2010 à 21:58:24    

Une remarque en passant:

Citation :

define FFL fflush(stdin)

:heink:  

Citation :

fflush(stdin);
 
Will compile but its behavior is undefined by the ANSI C standard. The fflush() function is only meant to be used on streams open for output, not input. Both fflush(stdin) and fflush(NULL), in some C libraries, flush stdout and stderr, but this is completely unportable! Thus, it should not be used.


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-01-2010 à 22:52:29    

J'avais pris ca d'une correction d'exercice que j'avais lu

Reply

Marsh Posté le 21-01-2010 à 20:01:20    

Si t'avais mis un tableau de structures, ça aurait été plus facile de faire des opérations et après mettre à jour le fichier.
 
Dans ton exemple, on ne peut définir un ordinateur par son année, vu que plusieurs vont avoir la même ce qui entrainera leurs suppressions tous, ou la premier "ordinateur" trouvé si tu mets un break dans ta boucle.
 
Donc, ce que je propose c'est de travailler sur un tableau dynamique de structures.
 
Et sinon tu peux garder ton code mais attribuer à chaque ordinateur un numéro d'identification unique, pour après copier dans le nouveau fichier, toutes les entrées précedentes sauf celui ayant ce numéro.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed