Suppression d'une structure dans un fichier

cs_ragon Messages postés 2 Date d'inscription samedi 16 janvier 2010 Statut Membre Dernière intervention 19 janvier 2010 - 16 janv. 2010 à 19:18
cs_ragon Messages postés 2 Date d'inscription samedi 16 janvier 2010 Statut Membre Dernière intervention 19 janvier 2010 - 19 janv. 2010 à 20:53
bonjour,

je souhaite simplement supprimer toute une structure d'un fichier, mais je n'y arrive pas.
Voila mon code, j'ai essayé un truc mais ca fonctionne pas super bien

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FFL fflush(stdin)


struct ordinateur
{
    char type_proc[20];
    char vitesse_proc[20];
    char ram[20];
    char HD[20];
    char annee[20];
};

struct carnet
{
    struct ordinateur nbpc[50];
    int compteur;
};


void saisie(FILE*fichier,/*FILE*fichieran,*/struct ordinateur *pc);
void saisieannee(FILE*fichier,/* FILE*fichieran, */struct ordinateur *pc);
void affichage(FILE*fichier);
void suppression(FILE*fichier, struct ordinateur *pc);


int main(void)
{
    FILE*fichier=NULL;
    fichier=fopen("ordinateur.lst","a");
    struct ordinateur pc;
    int option;
    do
    {
        printf("\tMenu");
        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.");
        scanf("%d",&option);
        switch (option)
        {
        case 1:
            saisie(fichier/*,fichieran*/,&pc);
            break;

        case 2:
            saisieannee(fichier/*,fichieran*/,&pc);
            break;

        case 3:
            affichage(fichier);
            break;

        case 4:
            suppression(fichier,&pc);
            break;
        }

    }
    while (1);
    return 0;

}
void saisie(FILE*fichier/*,FILE*fichieran*/, struct ordinateur *pc)
{

    if (fichier==NULL)
        puts("probleme a l'ouverture du fichier");
    else
    {
        fichier=fopen("ordinateur.lst","a");
        FFL;
        puts("quelle est l'annee d'achat");
        FFL;
        gets((*pc).annee);
        fprintf(fichier, "annee d'achat: %s\n", (*pc).annee);
        FFL;
        puts("quelle est le type du processeur");
        FFL;
        gets((*pc).type_proc);
        fprintf(fichier, "type processeur: %s\n", (*pc).type_proc);
        puts("quelle est la vitesse du processeur");
        FFL;
        gets((*pc).vitesse_proc);
        fprintf(fichier, "vitesse proc: %s\n", (*pc).vitesse_proc);
        FFL;
        puts("quelle est la taille de la memoire vive");
        FFL;
        gets((*pc).ram);
        fprintf(fichier, "taille ram: %s\n", (*pc).ram);
        FFL;
        puts("quelle est la taille du disque dur");
        FFL;
        gets((*pc).HD);
        fprintf(fichier, "taille du disque dur: %s\n", (*pc).HD);

        fclose(fichier);


    }
}

void saisieannee(FILE*fichier/*,FILE*fichieran*/,struct ordinateur *pc)
{
    char chaine[5000] = "";
    fichier=fopen("ordinateur.lst","r");
    if (fichier != NULL)
    {
        while (fgets(chaine, 5000, fichier) != NULL)
        {
            printf("%s", chaine);
        }
        fclose(fichier);
    }

    char year[5];
    char date[20];
    FFL;
    puts("entrez la date");
    gets(date);
    char ordi[20]="ordi";
    char nfichier[20];
    char lst[6]=".lst";
    strcpy(nfichier,ordi);
    strcat(nfichier,date);
    strcat(nfichier,lst);
    printf("le nom du fichier est: %s\n",nfichier);

    if (strcmp(date,(*pc).annee)==0)
    {
        fichier=fopen(nfichier,"a");

        fprintf(fichier, "annee d'achat: %s\n", (*pc).annee);
        fprintf(fichier, "type processeur: %s\n", (*pc).type_proc);
        fprintf(fichier, "vitesse proc: %s\n", (*pc).vitesse_proc);
        fprintf(fichier, "taille ram: %s\n", (*pc).ram);
        fprintf(fichier, "taille du disque dur: %s\n", (*pc).HD);

        fclose(fichier);
    }
}




void affichage(FILE*fichier)
{
    char name[20];
    int caractuel = 0;
    puts("quel fichier voulez vous ouvrir(tapez le nom exact)");
    FFL;
    gets(name);
    fichier = fopen(name,"r");

    if (fichier != NULL)
    {

        do
        {
            caractuel = fgetc(fichier);
            printf("%c", caractuel);
        }
        while (caractuel != EOF);
        fclose(fichier);

    }

}


void suppression(FILE*fichier,struct ordinateur *pc)
{
    int caractereActuel = 0;
    char chaine[2000];

    char year[20];
    FILE*fichier2;
    fichier = fopen("ordinateur.lst", "r");
    /* puts("quelle est l'annee d'achat de l'ordinateur a supprimer?");
     FFL;
     gets(year);
     printf("l'annee d'achat du pc a supprimer est: %s",year);
    */
    fichier2=fopen("tempo.lst","w");
    char ligne[256];
    int i=0;

    rewind(fichier);
    while (fread(&(*pc),sizeof(struct ordinateur),1,fichier) && !feof(fichier))
    {
        if (strcmp((*pc).annee,"1999")==0)
        {
            fseek(fichier,sizeof(struct ordinateur),SEEK_CUR);

        }
        fwrite(&(*pc),sizeof(struct ordinateur),1,fichier2);
    }
    fclose(fichier);
    fclose(fichier2);



    /*fgets(ligne, sizeof ligne, fichier);

        printf("%s\n",ligne);
        if (strcmp(year,(*pc).annee)==0)
        {
            fputs(ligne, fichier2);

        }   */

    /* while (fgets(ligne, sizeof ligne, fichier))
    {
    if (ligne[15] != '\n')
    {
    //  ligne[0]=" ";

     fputs(ligne, fichier2);
    }   }











    /*
    char chaine[20000] = "";
    char year[5];
    fgets(chaine, TAILLE_MAX, fichier);
    printf("%s", chaine);
    fseek(f, 0L, SEEK_SET);
    for(i = 0; i < year; i++)
    getc(f);
    */
}

3 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 janv. 2010 à 19:29
Salut,

Je n'ai pas lu ton code, mais on ne peut pas vraiment supprimer dans un fichier (Avec du code standard).
Il faut par exemple lire le fichier, le fermer, puis l'ouvrir en w+ et tout réécrire dedans, puis le refermer. Ou, plus sûr, utiliser un fichier intermédiaire : Tu lis le fichier, tu écris dans un autre fichier. Quand tu as fini d'écrire, tu supprime le premier fichier et renomme le second du même nom que le premier.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 janv. 2010 à 19:37
Ah heu c'est ce que tu as essayé de faire on dirait.
Ca à l'air pas trop mal, mais pourquoi faire le fseek ? fread revient à faire un fseek. Donc là, tu supprime l'enregistrement suivant celui que tu veux supprimer.

D'autre part :
"&(*pc)" est équivalent à "pc".
Et "(*pc)." est souvent écrit "pc->".

Plutôt quelque chose comme ça :
    while (!feof(fichier) && fread(pc,sizeof(struct ordinateur),1,fichier))
    {
        if (strcmp(pc->annee,"1999"))
        {
            fwrite(pc,sizeof(struct ordinateur),1,fichier2);
        }
    }
0
cs_ragon Messages postés 2 Date d'inscription samedi 16 janvier 2010 Statut Membre Dernière intervention 19 janvier 2010
19 janv. 2010 à 20:53
Bonsoir,

en fait j'ai longuement cherché, et je n'ai reussi qu'a faire ca:
void suppression(struct ordinateur *pc)
{
    FILE*fichier=NULL;
    int caractereActuel = 0;
    char chaine[2000];

    char year[20];
    FILE*fichier2=NULL;
    fichier = fopen("ordinateur.lst", "r");
    fichier2=fopen("tempo.lst","w");
    printf("\n\n");
    rewind(fichier);
    char chaine2[200];
    char chaine3[200];
    char chaine4[200];
    char chaine5[200];

    int i=15;


    fgets(chaine, 2000, fichier);
    int ouinon =0;
    char chaine7[200];
    int sortie=0;
    printf("%s",chaine);
    do
    {
        {
            fgets(chaine2, 2000, fichier);
            printf("%s",chaine2);
            fgets(chaine3, 2000, fichier);
            printf("%s",chaine3);
            fgets(chaine4, 2000, fichier);
            printf("%s",chaine4);
            fgets(chaine5, 2000, fichier);
            printf("%s",chaine5);
            puts("est ce la machine que vous souhaitez supprimer ?1 pour oui, 0 pour non");
            scanf("%d",&ouinon);
            while (ouinon==0)
            {
                if (ouinon==0)
                {
                    fputs(chaine,fichier2);
                    fputs(chaine2,fichier2);
                    fputs(chaine3,fichier2);
                    fputs(chaine4,fichier2);
                    fputs(chaine5,fichier2);
                    fputs(chaine7,fichier2);

                    fgets(chaine2, 2000, fichier);
                    printf("%s",chaine2);
                    fgets(chaine3, 2000, fichier);
                    printf("%s",chaine3);
                    fgets(chaine4, 2000, fichier);
                    printf("%s",chaine4);
                    fgets(chaine5, 2000, fichier);
                    printf("%s",chaine5);
                    fgets(chaine7, 2000, fichier);
                    printf("%s",chaine7);
                    puts("est ce la machine que vous souhaitez supprimer ?1 pour oui, 0 pour non");
                    scanf("%d",&ouinon);

            }    }
        }
        puts("sortir ?1oui 0non");
        scanf("%d",&sortie);

    }
    while (sortie==0);

    printf("\n\n");
    char chaine6[2000];
    while (fgets(chaine6, 2000, fichier) != NULL)
    {
        printf("%s", chaine6);
        fputs(chaine6,fichier2);
    }

    fclose(fichier);
    fclose(fichier2);
}



Je vais essayer ce soir avec ta méthode parce que la mienne est une vraie usine a gaz. Cela dit elle fonctionne quand meme...

En revanche j'ai un problème pour la fonction saisieannee. Je souhaite qu'elle trie toutes les structures du fichier "ordinateur.lst", mais je vois pas trop comment faire non plus, parce qu'actuellement je ne range que la toute derniere structure rentrée.
0
Rejoignez-nous