Fichier en c++

Résolu
sneajy Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
alors voila je suis debutant en c++ jutilise a peine les fichiers en c++, mon prob c que j'ai un fichier comme suit
const char *fichier="fiche.txt";
et juste avant une fonction menu qui decrit mon programme, il se trouve que ce que je raconte dans mon menu s'enregistre dans mon fichier. ce qui fausse toutes les informations qui se trouvent dans mon fichier, je voudrais savoir comment regler ce prob. merci par avance
pour info jutilise borland 5.01 sur vista

vla un bout du code

void menu()
{
clrscr();
cout<<"Menu du programme";
cout<<"\n\tA \32 Enregistrer ....";
cout<<"\n\tC \32 Afficher la liste des employ\x82s ...";
cout<<"\n\tE \32 Afficher la liste par ordre alphab\x82tique....";
cout<<"\n\tF \32 Afficher la liste des employ\x82s....";
cout<<"\n\tG \32 Augmentation de salaire....";
cout<<"\n\tH \32 Calcul et affichage du montant...";
cout<<"\n\tI \32 Calcul et affichage du montant dispos\x82....";
cout<<"\n\tJ \32 R\x82vocation....";
cout<<"\n\nEntrez la lettre (en minuscule)....";
}

const char *fichier="fiche.txt";

//la fonction qui fait un enregistrement dans le fichier
void enregistrement()
{
//declaration d'un flux d'ecriture
ofstream ecrire;
clrscr();
cout<<"Entrer le Nif de l'employ\x82: ";
char ni[30];
gets(ni);
while(strcmp(ni,"")==0)
{
cout<<"Vous n'avez saisi aucun caract\x8are,\nVous devez entrer au moins un caract\x8are: ";
gets(ni);
}
int r=recherche(ni);
if(r!=1)
{
//ouverture du fichier
ecrire.open(fichier,ios::ate|ios::out|ios::app);
if(!ecrire)
{
cerr<<"Impossible d'ouvrir le fichier en ecriture";
getch();
exit(0);
}
char n[30], p[30], s, ad[50], t[30], po[30], d[30], ser[30], z[30], v[30];
int a;
float sal;
cout<<"\nson nom: ";
gets(n);
cout<<"\nson prenom: ";
gets(p);
cout<<"\nSon sexe(m=masculin ou f=f\x82minin): ";
cin>>s;
while((s!='m') && (s!='f'))
{
cout<<"\n\nDonn\x82\e fournie incorrecte: "<<s<<"\nR\x82\essayez (m/f)";
cin>>s;
}
cout<<"\nson \x83ge: ";
cin>>a;
cout<<"\nson adresse: ";
gets(ad);
cout<<"\nson t\x82l\x82phone(Ex: 3400-0000): ";
gets(t);
cout<<"\nson poste: ";
gets(po);
cout<<"\nson salaire: ";
cin>>sal;
cout<<"\nla date de son embauche(Ex: 09/09/09): ";
gets(d);
cout<<"\nle service auquel il est affect\x82: ";
gets(ser);
cout<<"\nsa zone de travail(province ou capital): ";
gets(z);
while(strcmp(z,"capital")!=0 && strcmp(z,"province")!=0)
{
cout<<"\n\nDonn\x82\e fournie incorrecte: "<<z<<"\nR\x82\essayez (capital ou province)";
gets(z);
}
cout<<"\nsa ville: ";
gets(v);
employe c(ni,n,p,a,s,ad,t,po,sal,d,ser,z,v);
ecrire.write((unsigned char *)&c,sizeof(employe));
ecrire.close();
}
else
cout<<"ce Nif se trouve d\x82j\x85 dans la base de donn\x82\e";
getch();

}
//les autres fonctions
....
....
....
//fonction principale
void main()
{
clrscr();
menu();
char choix;
choix=getch();
do
{
switch(choix)
{
case 'a':
{
enregistrement();
menu();
break;
}
....
....
}


mais quand je mets en commentaire l'appel de la fonction menu() ca marche, ca ne fausse plus les informations dans le fichier!!! et je vous dis pas a quel point que ca m'enerve!!!
merci de repondre
A voir également:

1 réponse

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
En fait je pense qu'il te manque de trois truc sur les stream pour comprendre ce qui se passe.

En C++ :

1) les classes de flux sont notés avec un 'o' (comme out) quand elles servent à écrire : std::ostream (header <ostream>), std::ostringstream, std::ofstream

2) les classes de flux sont notés avec un 'i' (comme in) quand elles servent à lire : std::istream (header <istream>), std::istringstream, std::ifstream

3) les classes manipulant un fichier sont notées avec un 'f' (comme file) : std::ifstream, std::ofstream. Ces classes dérivent respectivement de std::istream et std::ostream (header <fstream>)

4) même principe pour les string notées avec un 'string' (header <sstream>)

De plus tu as trois flux standards (header <iostream>) :

1) std::cin : l'entrée standard, ce que tu tapes dans une console si ton programme est lancé comme tel (qui est en fait un std::istream). Sous linux c'est équivalent au fichier /dev/stdin.

2) std::cerr : la sortie d'erreur (qui est en fait un std::ostream). Sous linux c'est équivalent au fichier /dev/stderr. Concrètement ce qui est écrit dans std::cerr s'affiche dans la console mais peut être redirigé aisément.

3) std::cout : la sortie standard (qui est en fait un std::ostream). Sous linux c'est équivalent au fichier /dev/stdout. Concrètement ce qui est écrit dans std::cout s'affiche aussi dans la console mais peut être redirigé aisément et indépendamment de std::cerr.

De même tu as quelques constantes sympas comme std::endl pour le retour à la ligne et qui permet de ne plus taper \r\n sous windows et \n sous unix.

Pour manipuler des fichiers il suffit de créer le std::ifstream/std::ofstream et de vérifier que celui-ci n'est pas nul. S'il est nul cela signifie que le fichier ne peut pas être manipulé fautes de place ou de droits. Il ne faut fermer que les stream qui se sont ouverts avec succès (et il faut penser à tous les fermer quelque soit la manière dont se termine le programme). Seuls les std::ofstream et std::ifstream doivent être au préalable ouvert / fermer pour être manipulés.

En résumé voici comment se manipule un fichier :
#include <fstream>
#include <iostream>

int main(){
  const char *filename = "pouet.txt";
  std::ifstream ofs(filename);

  // Je vérifie que le fichier est bien ouvert
  if(!ofs){
    std::cerr << "can't write " << filename << std::endl;
    return 1;
  }

  // J'écris dans le fichier
  ofs << "plop !" << std::endl;

  // Je ferme le fichier
  ofs.close();
  return 0;
}

Le principe est le même pour les std::ifstream (sauf qu'on utilise >> pour lire dedans). L'opérateur >> est spécifique aux std::istream, il est donc disponible pour les std::istringstream également. De même l'opérateur << est disponible pour les std::ostream, std::ofstream et std::ostringstream.

Bonne chance
0