Fichiers et flux de données - David Saint
Transcription
Fichiers et flux de données - David Saint
Langage C++ Fichiers et flux de données 21/11/02 Les fichiers et flux de données 1 LES MOYENS : 3 CLASSES ................................................................................................................................. 1 1.1 2 OUVRIR ET FERMER UN FICHIER - LES FONCTIONS OPEN () CLOSE().................................................. 1 2.1 2.2 3 ECRITURES NON FORMATÉES PUT() WRITE() ........................................................................................................ 4 LECTURES NON FORMATÉES GET() READ()........................................................................................................... 4 SE DÉPLACER DANS LE FLUX DE DONNÉES TELL(P/G), SEEK(P/G)........................................................................... 4 GÉRER L’ÉTAT DU FLUX................................................................................................................................... 5 5.1 5.2 5.3 6 LIRE DES DONNÉES FORMATÉES AVEC L’OPÉRATEUR D’EXTRACTION >> .............................................................. 3 ECRIRE DES DONNÉES FORMATÉES AVEC L’OPÉRATEUR D’INJECTION <<............................................................... 3 LECTURE ET ECRITURE NON FORMATÉ - SE DÉPLACER DANS LE FLUX............................................ 4 4.1 4.2 4.3 5 LA FONCTION OPEN().......................................................................................................................................... 2 LES MODES D’OUVERTURE .................................................................................................................................. 2 LECTURE ET ÉCRITURE FORMATÉE DES DONNÉES ................................................................................. 3 3.1 3.2 4 CRÉER DES INSTANCES DES CLASSES POUR GÉRER LES FICHIERS ........................................................................... 1 LES FONCTIONS GOOD(), EOF(), FAIL(), BAD() ET CLEAR().................................................................................... 5 DÉTECTER LA FIN DE FICHIER LORS D’UNE OPÉRATION DE LECTURE AVEC >> ....................................................... 6 GÉRER LES ERREURS D’OUVERTURE DE FICHIER................................................................................................... 6 EXEMPLE TRAITEMENT DU FICHIER PIÈCE ............................................................................................... 6 6.1 6.2 STRUCTURE DE DONNÉES.................................................................................................................................... 7 EXEMPLES DE PROGRAMMES............................................................................................................................... 8 7 TABLE DES EXEMPLES DE CODE.................................................................................................................. 10 1 LES MOYENS IOS : 3 CLASSES ISTREAM Les fichiers peuvent être gérés comme des flux de données de la même manière que les entrées sorties standards (Voir Gestion des flux avec *stream). Trois classes sont disponibles : § ifstream fichier en lecture seulement § ofstream fichier en écriture seulement IFSTREAM § fstream fichier en lecture et écriture. OSTREAM IOSTREAM FSTREAM OFSTREAM 1.1 Créer des instances des classes pour gérer les fichiers ifstream fichierEntree ; ofstream fichierSortie; fstream fichierES; // instance d’un flux de données fichier en lecture // instance d’un flux de données fichier en écriture // instance d’un flux de données fichier en R/W Remarque : Si les données contenues dans le fichier, ne sont pas modifiées, le fichier doit être ouvert en lecture seulement. 2 OUVRIR ET FERMER UN FICHIER - LES FONCTIONS OPEN () CLOSE() Pour chaque type de fichier, il existe plusieurs méthodes (fonctions à appliquer), les principales sont : open () : ouvre un fichier close(): ferme un fichier ouvert Ces deux fonctions sont obligataires dans le programme. Elles associent un flux de données (stream, tampon, canal) au fichier. § open () : Crée un flux (stream) associé à l’objet fichier. Ensuite les données du flux sont exploitées David Saint-Mellion page 1/10 #include <fstream> using namespace std; int main(void){ ofstream monFichier; monFichier.open("mesure.dat"); //---TRAITEMENT--monFichier.close(); return 0; } Langage C++ Fichiers et flux de données 21/11/02 close() : Enregistre les données du flux dans le fichier, détruit le flux de données et l’instance du fichier dans le programme. Remarque : Par défaut, le destructeur appelle la fonction close(). Exemple Ouvrir Fermer un fichier Fichier : mesure.dat 1 -Ouvrir : Associe un flux de données au fichier monFichier.open("mesure.dat"); Flux de données : monFichier 12.5 12 12.9 13 12 13.5 12.1 12.3 12.5 12 12.9 13 12 13.5 12.1 12.3 2 -Traitement : Modifie les données du flux de données Flux de données : monFichier Fichier : mesure.dat 12.5 12 12.9 13 12 13.5 12.1 12.3 13.5 11.5 3 - Fermer : Enregistre les données dans le fichier et détruit le flux de données monFichier.close(); 12.5 12 12.5 12 12.9 13 12 13.5 12.1 12.3 13.5 11.5 2.1 La fonction open() Elle ouvre le fichier et associe un flux de données. void open(const char *nom, int mode,int prot=filebuf::openprot); nom : nom du fichier à ouvrir mode : mode d'ouverture du fichier prot : il définit les droits d'accès au fichier dans le cas d'une ouverture avec création (sous UNIX). 2.2 Les modes d’ouverture ios::app ios::ate ios::in ios::out ios::binary ios::trunc ios::nocreate ios::noreplace Ajouter toujours les données en fin de fichier Ouvrir le fichier en écriture avec positionnement à la fin du fichier Ouverture en lecture (par défaut pour ifstream) Ouverture en écriture (par défaut pour ofstream) Ouverture en mode binaire (par défaut en mode texte) Détruit le contenu du fichier s'il existe (par défaut pour ofstream) Si le fichier n'existe pas, l'ouverture échoue Si le fichier existe, l'ouverture échoue, sauf si ate ou app sont activés Exemples : Ouverture de fichiers open() #define NOM_FICHIER "mesure.dat" ifstream fichierPieceE; // Fichier Pièce en lecture ofstream fichierPieceS; // Fichier Pièce en écriture fstream fichierTmp; // Fichier Pièce en lecture // Ouvre le fichier Pièce en lecture fichierPieceE.open(NOM_FICHIER); // Ouvre le fichier en écriture avec destruction du contenu fichierPieceS.open(NOM_FICHIER); //1 // Ouvre le fichier sans destruction du contenu « Mode ajout à la fin » // et avec positionnement à la fin du fichier fichierPieceS.open( NOM_FICHIER,ios::app); //2 // Ouvre le fichier en R/W et détruit son contenu fichierTmp.open(FICHIER_TMP,ios::in|ios::out|ios::trunc); //1 Les modes d’ouverture sont surtout important en écriture. Soit on souhaite : § Ajouter des données, le mode naturel est de les insérer à la fin du fichier existant en utilisant les modes d’ouverture : ios: :app ou ios: :ate //2. § Renouveler les données du fichier, il faut alors détruire les données //1. David Saint-Mellion page 2/10 Langage C++ Fichiers et flux de données 21/11/02 3 LECTURE ET ECRITURE FORMATEE DES DONNEES Un flux de données est associé à l’objet fichier. On bénéficie des fonctionnalités des classes iostream (voir diagramme $1) : Les fonctions, les opérateurs injection << et extraction >> et les manipulateurs de flux de données qui s’appliquent aussi aux flux de données fichiers. 3.1 Lire des données formatées avec l’opérateur d’extraction >> Exemple 31 : Lecture formatée avec l’opérateur d’extraction >> #include <iostream> #include <fstream> using namespace std ; int main(void){ float cote=0 ; ifstream fMesure; //Crée un objet flux fichier en lecture fMesure.open("mesure.dat"); //Ouvre le fichier fMesure >> cote; cout<<"La cote de la PIECE 1 vaut : "<<cote<<endl; fMesure >> cote; cout<< "la cote de la PIECE 2 vaut : "<<cote<<endl; fMesure.close(); //Ferme le fichier et le flux return 0; } Remarques § L’opérateur d’extraction prélève la donnée dans le flux et l’affecte à cote. De plus, il gère le déplacement sur l’objet suivant se trouvant dans le flux. Cet opérateur peut être surchargé pour s’adapter à d’autres types de données que ceux du langage C++. § Voir : Gestion des flux avec *stream, surcharge des opérateurs >> et << § Voir : Exemples $6 3.2 Ecrire des données formatées avec l’opérateur d’injection << Exemple 32 : Ecriture formatée avec l’opérateur d’injection << #include <iostream> #include <fstream> using namespace std ; int main(void){ float cote1=13; float cote2=13.5; float cote3=13.8; ofstream fMesure; // Instance flux fichier en lecture // Ouvre le fichier en lecture avec destruction des données fMesure.open("mesure.dat"); fMesure << cote1<< endl; fMesure << cote2<< endl; fMesure << cote3<< endl; fMesure.close(); // Ferme le fichier et le flux return 0; Résultat dans le fichier } Remarques § L’opérateur d’injection affecte la donnée coteX au flux de données. Le retour chariot endl est également injecté pour séparer les données. La fonction close() enregistre les données dans le fichier «mesure.dat». § Cet opérateur peut être surchargé pour s’adapter à d’autres types de données que ceux du langage C++. Pour ajouter les données au fichier existant (à la fin), il faut l’ouvrir en mode app monFichier.open("mesure.dat",ios::app); § Voir : Gestion des flux avec *stream, surcharge des opérateurs >> et << § Voir : Exemples $6 David Saint-Mellion page 3/10 Langage C++ Fichiers et flux de données 21/11/02 4 LECTURE ET ECRITURE NON FORMATE - SE DEPLACER DANS LE FLUX 4.1 Ecritures non formatées put() write() Les fonctions pour lire des données dans un fichier sont issues de la classe ostream Voir Gestion des flux avec *stream. § put(char c) Insére le caractère passé en paramètre § write(const char*, int n) Insère la chaîne de n caractères, passée en paramètre Exemple : put() monFichier.put(‘W’); // Ecrit le caractère W dans monFichier Exemples : write() monFichier.write("Dupont",6); // Ecrit Dupont dans monFichier const char nom[] = "Dupont"; monFichier.write(nom,sizeof(nom)); // sizeof(nom) vaut 7 octets soit 6 caractères + 0x00(fin chaîne) 4.2 Lectures non formatées get() read() Les fonctions - get(), getline(), read() - permettent de lire des données dans un fichier. Elles sont issues de la classe istream Voir Gestion des flux avec *stream. § char get() : Extrait un caractère et le retourne systématiquement - get(&char) l’affecte à la variable de référence § read( char *s, int n) : Lit une série de caractères( octets), paramètres : Un pointeur sur la zone où les caractères sont affectés et le nombre de caractère à prélever. Exemple : get() char car ; monFichier.get(car); // Lit une caractère dans monFichier et l’affecte à car Exemple : read() float cote ; monFichier.read(&cote, sizeof(cote)); // Lit un entier dans monFichier et l’affecte à cote 4.3 Se déplacer dans le flux de données tell(p/g), seek(p/g) La position est définie par le type streampos dans <ios> et correspond à la position d’un octet dans le flot de données. Trois constantes de positionnement dans le flux de données sont définies : § beg Début du flux (0) end Fin du flux cur Position courante dans le flux Les fonctions pour se déplacer dans un flux fichier sont : § tellg et seekg - g comme get() réservé au flux fichier en lecture § tellp et seekp - p comme put() réservé au flux fichier en écriture Ces fonctions permettent de lire et de fixer une nouvelle valeur à la position dans le flux de données fichier courant. § streampos tellp() Retourne la position courante dans le flot de données de sortie. La première position est 0. § seekp(streampos position n) Se positionner dans le flot de données de sortie à n octets par rapport au début du flux. seekp(streamoff n, seek_dir dir) Se positionne à n octet(s) par rapport à dir ( au début du flot : dir = beg , à la position courante : dir = cur à la fin du flot : dir = end (n peut être négatif) Les fonctions tellg() et seekg() sont similaires Exemple 43-1 : Relire la dernière donnée écrite float cote=10.1; float coteLu=0; David Saint-Mellion page 4/10 Langage C++ Fichiers et flux de données 21/11/02 fstream fMesure; // Instance fichier en lecture // Ouvre le fichier en R/W et positionnement à la fin pour ajout fMesure.open("mesure.dat",ios::in|ios::out|ios::ate); fMesure<<cote<<endl; // Écrit la donnée fMesure.seekg(-(sizeof(cote)+sizeof('endl')),ios::end); // Se replace fMesure>>coteLu; // Relit les données cout<<"DONNES du flux fichier : "<<coteLu<<endl; Exemple 43-2 : Taille du fichier ifstream fMesure ; streampos positionCourante; // Instance fichier en lecture // Variable de position fMesure.open("mesure.dat"); // Ouvre le fichier streampos positionCourante = monFichier.tellg(); //Mémorise la position début fMesure.seekg(0, ios::end); // Se positionne à la fin cout<<"Taille du fichier : "<< fMesure.tellg()<<" octet(s)<< endl; fMesure.seekg(positionCourante, ios::beg); // Reprend la position début Exemple 43-3 : Relire une série de données dans un flux fichier après écriture float cote1=111.1; float cote2=222.2; float coteLu=0; fstream fMesure; // Instance fichier en lecture streampos OldPosition; // Variable de position // Ouvre le fichier en R/W et positionnement à la fin pour ajout fMesure.open("mesure.dat",ios::in|ios::out|ios::ate); OldPosition=fMesure.tellp(); // Mémorise la position fMesure<<cote1 <<endl<<cote2<<endl; // Écrit les données // Replace le pointeur de flux à l'ancienne position fMesure.seekg(OldPosition,ios::beg); // Reprend l’ancienne position // Relit les données tq pas EOF voir $542 while(fMesure>>coteLu) cout<<"DONNES du flux fichier : "<<coteLu<<endl; fMesure.close(); Voir exemples 64 et 65 5 GERER L’ETAT DU FLUX L’état du flux de données est indiqué par des drapeaux : (Voir Gérer des flux avec *stream) ios: :eofbit Indique la fin de fichier ios: :goodbit Indique l’état normal du flux, lorsqu’il ne s’est produit aucune erreur ios: :badbit Indique qu’une opération a échoué. N’interdit pas la poursuite des opérations - warning ios: :failbit Indique qu’une erreur logique s’est produite lors d’une opération de lecture. ios: :harfail Indique qu’une erreur grave s’est produite. Exemple défaillance matériel : secteur défectueux d’un disque, coupure réseau 5.1 Les fonctions good(), eof(), fail(), bad() et clear() Ces fonctions sont des assesseurs des indicateurs des bits d’état du flux. Elles renvoient un booléen La fonction clear() permet de repositionner ces indicateurs. Exemple 51 : Evolution des bits indicateurs d’état du flux #include <fstream> #include <iostream> using namespace std; int main(void) { float cote=0; fstream fichierPiece ; fichierPiece.open("mesure.dat"); //Etat 1 David Saint-Mellion page 5/10 // Etat 1 Langage C++ Fichiers et flux de données while(fichierPiece>>cote){ cout<<"Cote "<<cote<<endl; } //Etat 2 21/11/02 // Etat 2 fichierPiece.clear(); //Etat 3 return 0; // Le destructeur ferme le fichier } § § § § // Etat 3 // Etat 1 A l’issue de l’ouverture du fichier, le flux est dans son état normal : ios::goodbit=1, ios::eofbit=0, ios::badbit=0 , ios::failbit=0 // Etat 2 A l’issue du parcourt, la fin de fichier est atteinte - eof valide, le flux n’est plus dans un état normal : ios::goodbit=0, ios::eofbit=1, ios::badbit=0 , ios::failbit=1 // Etat 3 clear() repositionne les indicateurs d’état ios::goodbit=1, ios::eofbit=0, ios::badbit=0 , ios::failbit=0, // Etat 1 Lors de la tentative d’ouverture d’un fichier inexistant, le bit fail est activé. En conséquence, good passe à ‘0’ et indique que le flux n’est pas dans un état normal . ios::goodbit =0, ios::eofbit=0, ios::badbit=0 , ios::failbit=1 Ouverture d’un fichier inexistant 5.2 Détecter la fin de fichier lors d’une opération de lecture avec >> L’opérateur d’extraction >> renvoie la valeur la valeur ’0’ sur l’instance de la classe lorsqu’il y a une erreur de lecture ou qu’il rencontre la fin de fichier - fichierPiece>>cote retourne alors ‘0’. La structure while exécute la boucle tant que EOF n’est pas trouvé while(fichierPiece>>cote){ cout<<"Cote "<<cote<<endl; } Exemple 52 : Lire et afficher toutes les données d’un fichier float cote=0 ; ifstream fMesure; //Crée un objet fichier en lecture fMesure.open("mesure.dat"); //Ouvre le fichier fMesure >>cote; // Lit le fichier tq != EOF while(fMesure>>cote) cout<<cote<<endl; Voir aussi : Exemples 532 et $6 5.3 Gérer les erreurs d’ouverture de fichier Pour gérer l’échec d’ouverture du fichier on utilise les assesseurs fail() ou gool() - fail() renvoie la valeur true (gool() - false), s’il y une erreur – Voir Gestion des flux avec *stream). Exemple : Gérer les erreurs d’ouverture de fichier #define ERREUR_OUVERTURE true if (fichierPiece.fail()==ERREUR_OUVERTURE){ cerr<<"Erreur d'ouverture de NOM_FICHIER "<<endl; return 1; } Voir $6 exemples 63, 64 et 65 6 EXEMPLE TRAITEMENT DU FICHIER PIECE Liste de Série : Série = Date+ Nombre de pièces+ Cotes : Date = année+mois+jour+heure+minutes : David Saint-Mellion 0 à 20 Série, séparateur des éléments retour chariot ‘\n’ séparateur le retour chariot ‘\n’ alphanumérique, séparateur le point « . » Ex : 2002.09.29.10.48 page 6/10 Langage C++ Nombre de pièces : Cotes : Fichiers et flux de données 21/11/02 entier, valeurs comprises entre 1 et 100 tableau de 1 à 100 réels, séparateur l’espace « » Ex : 102.56 102 101.09 102.5 6.1 Structure de données Exemple 61 : Définition de la structure de données Piece // s_piece.h Déclaration de la structure Pièce et des fonctions #include <iostream> #include <string> using namespace std; struct Piece { string serie ; int nbrePieces; float cote[100]; }; // Surcharge de l’opérateur >> pour Piece istream &operator>> (istream &fluxE, Piece &p); // Surcharge de l’opérateur << pour Piece ostream &operator<< (ostream &fluxS, Piece &p); void afficher(Piece &p); // s_piece.cpp Définition du corps des fonctions #include "struct_piece.h" // Surcharge de l'opérateur>> istream &operator>> (istream &fluxI, Piece &p) { fluxI>>p.serie; fluxI>>p.nbrePieces; for (int i=0; i<p.nbrePieces; i++) fluxI>>p.cote[i]; return fluxI; } // Surcharge de l'opérateur<< ostream &operator<< (ostream &fluxS, Piece &p) { fluxS<<p.serie<<endl; fluxS<<p.nbrePieces<<endl; for (int i=0; i<p.nbrePieces; i++) fluxS<<p.cote[i]<<' '; fluxS<<endl; return fluxS; } void afficher(Piece &p) { void afficher(Piece &p) { cout<<p.serie<< " Nombre de pieces : "<<p.nbrePieces<<endl; cout<<" Cotes : "; for (int i=0; i<p.nbrePieces; i++) cout << p.cote[i] << ' '; cout<<endl; } // Saisir la données d'une série de pièces void saisir(Piece &p) { int i=0; float saisie; // Saisir les données de la série cout<<"Saisissez la serie an.mois.jour.heure.minute"<<endl; cin>>p.serie ; cout<<"Saisissez la cote, puis faire ENTR"<<endl; while (cin>>saisie){ p.cote[i]=saisie; i++; David Saint-Mellion page 7/10 Langage C++ Fichiers et flux de données 21/11/02 cout<<"Saisissez la cote, puis faire ENTR"<<endl; cout<<"Ou Terminez la saisie par CRTL 'Z' "<<endl; // CRTL 'Z' - Fin de fichier sur un PC } p.nbrePieces=i; // Renseigne nbrePieces } // Le passage des paramètres de la structure est réalisé par Référence 6.2 Exemples de programmes Exemple 62 : Ajouter une série de pièces au le fichier Pièce #include <iostream> #include <fstream> using namespace std; #include "s_piece.h" #define NOM_FICHIER "piece.dat" int main(void) { Piece serie; ofstream fichierPiece; // Fichier en écriture // Ouverture du fichier en mode Ajout et positionnement à la fin fichierPiece.open( NOM_FICHIER,ios::app); saisir(serie); fichierPiece<<serie ; return 0; // Le destructeur ferme et enregistre le fichier } Exemple 63 : Lire et Afficher les données des séries de pièces // Lit le fichier Pièces et affichage des données de chaque série // Gère les erreurs d’ouverture de fichier #include <fstream> #include <iostream> using namespace std; #include "s_piece.h" #define NOM_FICHIER #define ERREUR_OUVERTURE "piece.dat" true int main(void) { Piece serie; int nbreSeries=0; ifstream fichierPiece; // Fichier en lecture // Ouvre le fichier et gère l’erreur d’ouverture fichierPiece.open(NOM_FICHIER); if (fichierPiece.fail()==ERREUR_OUVERTURE){ cerr<<"Erreur d'ouverture de NOM_FICHIER "<<endl<<endl; return 1; } // Lit une série et l'affiche while(fichierPiece>>serie){ nbreSeries++; cout<<"SERIE "<<nbreSeries<<endl; afficher(serie); cout<<endl; } return 0; // Le destructeur ferme le fichier } Exemple 64 : Supprimer une série de pièces du fichier Pièce // Les séries sont copiées dans un fichier temporaire sauf la série à supprimer // Puis le fichier temporaire sont copiées dans le fichier Pièce David Saint-Mellion page 8/10 Langage C++ Fichiers et flux de données 21/11/02 #include <fstream> #include <iostream> using namespace std; #include "s_piece.h" #define NOM_FICHIER #define FICHIER_TMP #define ERREUR_OUVERTURE "piece.dat" "piece.tmp" false int main(void) { Piece serie; int numero=4; // Numéro de la série à supprimer int index=1; ifstream fichierPieceE; // Fichier Pièce en lecture ofstream fichierPieceS; // Fichier Pièce en écriture fstream fichierTmp; // Fichier Temporaire en R/W streampos debutTmp; // Variable de position flux // Ouvre le fichier Pièce en lecture fichierPieceE.open(NOM_FICHIER); if (fichierPieceE.good==ERREUR_OUVERTURE){ cerr<<"Erreur d'ouverture de NOM_FICHIER "<<endl<<endl; return 1; } // Ouvre le fichier Temporaire et détruit son contenu fichierTmp.open(FICHIER_TMP,ios::in|ios::out|ios::trunc); debutTmp=fichierTmp.tellg(); // Mémorise la position début // Copie les séries dans fichierTmp sauf celle à supprimer while(fichierPieceE>>serie){ if(index!=numero){ fichierTmp<<serie; } index++; } fichierPieceE.close(); // Ferme le fichier Pièce // Ouvre fichierPiece en lecture en détruisant son contenu fichierPieceS.open(NOM_FICHIER); fichierTmp.seekp(debutTmp,ios::beg); // Se repositionne au début // Copie les séries de fichierTmp à fichierPiece while(fichierTmp>>serie) fichierPieceS<<serie; return 0; // Les destructeurs ferment les fichiers } Exemple 65 : Constituer le fichier Série en se déplaçant dans le fichier Pièce // Recherche la taille du fichier Pièces, le nombre de séries // Renseigne le fichier Série avec : la taille du fichier Pièce, le nombre de // séries, le nombre total de pièces et le nombre de pièces dans chaque série #include <fstream> #include <iostream> using namespace std; #include "s_piece.h" #define NOM_FICHIER #define FICHIER_TMP #define ERREUR_OUVERTURE "piece.dat" "piece.tmp" true int main(void){ Piece serie; int nbreSeries=0; int totalPieces=0; int tailleFichier=0; David Saint-Mellion page 9/10 Langage C++ Fichiers et flux de données 21/11/02 streampos debutFichierPiece; // Position début fichier Pièce streampos positionTotalPieces; // Position de nbreSeries streampos positionNbreSeries; // Position de totalPieces ifstream fichierPiece; // Fichier en lecture ofstream fichierSerie; // Fichier en écriture // Ouvre le fichier Pièce en lecture fichierPiece.open(FICHIER_PIECE); if (fichierPiece.fail()==ERREUR_OUVERTURE){ cerr<<"Erreur d'ouverture de NOM_FICHIER "<<endl; return 1; } // Ouvre le fichier Série avec destruction du contenu fichierSerie.open(FICHIER_SERIE,ios::trunc); // Détermine la Taille du fichier Pièce, écrit la valeur dans fichier Série debutFichierPiece=fichierPiece.tellg(); // Mémorise la position début fichierPiece.seekg(0, ios::end); // Se positionne à la fin tailleFichier=fichierPiece.tellg(); fichierSerie<<tailleFichier<<endl; fichierPiece.seekg(debutFichierPiece, ios::beg);// Se repositionne au début // Réserve l'emplacement pour nbreSeries positionNbreSeries=fichierSerie.tellp(); // Mémorise la position nbreSeries fichierSerie<<nbreSeries<<endl; // Réserve l'emplacement nbreSeries // Réserve l'emplacement pour totalPiece positionTotalPieces=fichierSerie.tellp(); // Mémorise la position totalPieces fichierSerie<<totalPieces<<endl; // Réserve l'emplacement // Lit et écrit le nombre de pieces dans une série while(fichierPiece>>serie){ fichierSerie<<serie.nbrePieces<<' '; totalPieces += serie.nbrePieces; nbreSeries++; } // Ecrit totalPieces dans le fichier Série fichierSerie.seekp(positionNbreSeries, ios::beg); // Position sur nbreSerie fichierSerie<<nbreSeries; // Renseigne nbreSeries fichierSerie.seekp(positionTotalPieces, ios::beg); // Position totalPieces fichierSerie<<totalPieces; // Renseigne totalPieces return 0; // Les destructeurs ferment les fichiers } 7 TABLE DES EXEMPLES DE CODE Exemples : Ouverture de fichiers open()............................................................................................................ 2 Exemple 31 : Lecture formatée avec l’opérateur d’extraction >> ........................................................................ 3 Exemple 32 : Ecriture formatée avec l’opérateur d’injection << .......................................................................... 3 Exemple : put().................................................................................................................................................. 4 Exemples : write() ............................................................................................................................................. 4 Exemple : get().................................................................................................................................................. 4 Exemple : read() ............................................................................................................................................... 4 Exemple 43-1 : Relire la dernière donnée écrite ................................................................................................ 4 Exemple 43-2 : Taille du fichier ......................................................................................................................... 5 Exemple 43-3 : Relire une série de données dans un flux fichier après écriture ................................................. 5 Exemple 51 : Evolution des bits indicateurs d’état du flux .................................................................................. 5 Exemple 52 : Lire et afficher toutes les données d’un fichier .............................................................................. 6 Exemple : Gérer les erreurs d’ouverture de fichier ............................................................................................. 6 Exemple 61 : Définition de la structure de données Piece.................................................................................. 7 Exemple 62 : Ajouter une série de pièces au le fichier Pièce............................................................................. 8 Exemple 63 : Lire et Afficher les données des séries de pièces ......................................................................... 8 Exemple 64 : Supprimer une série de pièces du fichier Pièce ............................................................................ 8 Exemple 65 : Constituer le fichier Série en se déplaçant dans le fichier Pièce.................................................... 9 David Saint-Mellion page 10/10