Suppression dans un fichier en C++

Fermé
maryy Messages postés 14 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 26 mai 2004 - 1 mai 2002 à 11:33
ariock Messages postés 125 Date d'inscription dimanche 28 avril 2002 Statut Membre Dernière intervention 31 janvier 2005 - 4 mai 2002 à 20:16
Bonjour !

Bon voilà je débute le c++ et je galère pas mal en ce qui concerne les fichiers. Je ne trouve pas bcp de docs en plus. Je voudrais juste savoir comment on fait pour supprimer un enregistrement dans un fichier dans un programme en c++.

Je vous remercie d'avance !
A voir également:

2 réponses

ariock Messages postés 125 Date d'inscription dimanche 28 avril 2002 Statut Membre Dernière intervention 31 janvier 2005 5
1 mai 2002 à 12:22
Tu connais la programmation C? ben pareil... enfin tu peux toujours te servir des memes fonctions quoi... mais il y a aussi les flux, ofstream et ifstream qui facillitent pas mal de chose...

Pour ta question de suppresion:
Je suppose que tu a un fichier binaire ou tu enregistres des structures en pure sequentiel? Quel que soit ton organisation, le meilleur moyen de suprimer, c'est une suppresion logique avec un flag. Si tu tien a re-occuper les places vides, il faut que tu programme toi meme une gestion un peu plus complexe que simplement ajouter en bout...

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
maryy Messages postés 14 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 26 mai 2004 1
2 mai 2002 à 10:19
oui je connais bien la gestion des fichiers en c mais le truc c'est que en c, on déclare un pointeur au départ, ce qui nous permet de savoir sur quel fichier on travaille dans le cas où on en ouvre plusieurs.

J'utilise ofstream et ifstream pour les manip de fichiers en c++, donc je dois pas être loin de la vérité ! :p

Pour ma suppression :
En fait, j'ai un fichier dans lequel j'enregistre des enregistrements de type d'une classe avec "fout.write((char*) &nouveau, sizeof (Chroniqueur));", donc les enregistrements sont séquentiels.

Ce que j'ai commencé à faire pour ma suppression c'est ouvrir mon fichier en lecture et un fichier temporaire en écriture. Je voulais recopier tous les enregistrements à garder dans le temporaire (sans celui que je dois effacer) et par la suite, supprimer mon fichier original chroniqueurs.txt et renommer mon temporaire en films.txt. Voici mon prog :

void Film::supprimerfilm()
{
char titre[10], numero[8];
int compar;
int compt=0;

Film suppression;

//ouverture du fichier films.txt en lecture
ifstream fin ("films.txt", ios::in);
ofstream fout ("temp.txt");

cout<<"film a supprimer : ";
cin>>titre;
cout<<endl;
cout<<endl;

while (fin.read((char*) &suppression, sizeof (Film)))
{
compar=strcmp(suppression.titrefilm,titre);
if (compar == 0)
compt++;
}

if (compt == 0)
cout<<"ce film n'est pas enregistre"<<endl;

if (compt > 1)
{
cout<<"il existe plusieurs films avec ce titre"<<endl;
cout<<endl;
while (fin.read((char*) &suppression, sizeof (Film)))
{
compar=strcmp(suppression.titrefilm,titre);
if (compar == 0)
{
cout<<"numero : "<<suppression.numfilm<<endl;
cout<<"titre : "<<suppression.titrefilm<<endl;
cout<<"annee : "<<suppression.anneefilm<<endl;
cout<<endl;
}

cout<<"entrez le numero du film a supprimer : ";
cin>>numero;
}
}
if (compt != 0)
{
while (fin.read((char*) &suppression, sizeof (Film)))
{
if (compt == 1)
compar=strcmp(suppression.titrefilm,titre);

if (compt > 1)
compar=strcmp(suppression.numfilm, numero);

if (compar != 0)
{
//faire la suppression
do
{
fin.read((char*) &suppression, sizeof (Film));
if (fin.good())
fout.write((char*) &suppression, sizeof (Film));
}
while (!fin.eof());

}
}
}
fout.close();
fin.close();
}


Ce prog se compile bien mais ne recopie rien du tout dans le fichier temporaire ! Est-ce que vous voyez mon erreur ?

Maryy
0
ariock Messages postés 125 Date d'inscription dimanche 28 avril 2002 Statut Membre Dernière intervention 31 janvier 2005 5 > maryy Messages postés 14 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 26 mai 2004
2 mai 2002 à 10:39
Ben pas vraiment de raison de pas marcher ton truc, meme si on peux pas dire que l'algo (si on peux vraiment parler d'un algo) soit tres efficace...
Le seul vrai point qui me parait interessant, c'est de faire un flush avant de fermer ton fichier out...
Un autre petit detail qui peut etre utile c'est de ne pas te servir de la methode .write, mais de l'operateur << que tu peus surcharger pour ta classe film si le coeur t'en dis. Je n'ai jamais bien saisis pourquoi, mais l'operateur << et .write ne donnent pas toujours le meme resultat.
Ton fichier tmp il est a 0 byte ou il y a des crasses?
(Serieusement tu crois pas que de faire une gestion un peu plus pousee te ferais gagner en performence?)

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
Samir > ariock Messages postés 125 Date d'inscription dimanche 28 avril 2002 Statut Membre Dernière intervention 31 janvier 2005
2 mai 2002 à 10:52
salut,
bien vu, la j´ai une question comment ca ce fait que ton message est envoiyé a 10:39:23 (GMT+1), le mien est à à 10:33 GMT+1
et que l´ordonnecement des message est inversé,
j´ai peut etre une explication que ton horloge system est en avance de 6 mn :-).
0
ariock Messages postés 125 Date d'inscription dimanche 28 avril 2002 Statut Membre Dernière intervention 31 janvier 2005 5 > Samir
2 mai 2002 à 11:02
Possible possible, mais je t'avoue que ca ne me tracasse absolument pas une seule seconde d'avoir 6min d'avance... deja que d'ou je suis j'ai 1h d'avance sur la france...

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
ariock Messages postés 125 Date d'inscription dimanche 28 avril 2002 Statut Membre Dernière intervention 31 janvier 2005 5 > Samir
2 mai 2002 à 11:05
Ouais, ben non c'est tout simple pasque j'ai repondu au message sur le code et toi au message general... ca s'aligne en fonction des reponses

Je suis un gaucher contrariant. C'est plus fort que moi,
il faut que j'emmerde les droitiers.
0
salut,
pourai tu commenter ton code, parceque c un peut dificille de tout comprendre,
je crois que le probleme est dans l´ecriture du fichier
avant
fout.close();
il faut utiliser la methode flush .
0