gestion de fichiers operations de base en c++ sur les fichiers

26
Gestion de Fichiers Operations de Base en C++ sur les Fichiers

Upload: tilde-salomon

Post on 04-Apr-2015

119 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

Gestion de Fichiers

Operations de Base en C++ sur les Fichiers

Page 2: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

2

Plan du cours d’aujourd’hui

Fichiers logiques vs. fichiers physiques

Ouverture et fermeture des fichiers Lecture, écriture et recherche Caractères speciaux La structure du répertoire de l’Unix Périphériques et fichiers logiques Gestion de fichiers en Unix

Page 3: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

3

Ouverture de fichiers Une fois que l’identificateur du fichier logique

est connecté à un fichier physique ou à un périphérique, il est nécessaire de déclarer ce que l’on compte faire avec le fichier: Ouvrir un fichier existant Creer un nouveau fichier

Le fichier est pret à être utilisé par le programme.

On est positionné au début du fichier qui est maintenant prêt à la lecture/ écriture.

Page 4: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

4

Ouverture de fichiers en C

FILE * outfile;outfile = fopen (“monfichier.txt”,”w”);

Le premier argument indique le nom du fichier et le second le mode d’ouverture.

Le mode peut être: “r”, “w”, “a”, “r+”, “w+”, “a+”.

Page 5: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

5

Ouverture de fichiers en C++

fstream outfile;Outfile.open (“monfichier.txt”,ios::out);

Le second argument indique le mode. Sa valeur est calculée en appliquant l’operateur “|” (“bitweise or”) sur des constantes prédéfinies dans la classe ios.

Ces constantes sont: “ios::in”, “ios::out”, “ios::app”, “ios::trunc”, “ios::nocreate”, “ios::noreplace”, “ios::binary”, etc.

Page 6: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

6

Fichier logique vs. fichier physique

Fichier Physique: collection d’octets sauvegardés sur un disque ou sur une bande magnétique

Fichier Logique: “Canal” (analogie: ligne téléphonique) cachant les détails de la localisation et des caractéristiques physiques au programme

Lorsqu’un programme veut utiliser un fichier particulier, “data”, le système d’exploitation doit trouver le fichier physique appelé “data” et établir la connection en lui affectant un fichier logique. Le nom de ce dernier est celui utilisé dans le programme.

Page 7: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

7

Fichier logique vs. physique: C et C++

En C, a fichier logique est déclaré comme suit: FILE *outfile;

En C++, c’est fait comme ceci:

fstream outfile; Ici, ce nom est déclaré comme un objet de la classe fstream. Dans les deux langues, le nom logique outfile sera associé

plutard à un nom physique.

Page 8: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

8

Fermeture de fichiers Permet au nom logique du fichier d’être utilisé par

un autre fichier physique (c’est comme raccrocher le téléphone après un appel).

Garantit que tout ce qui a été ecrit dans le fichier est en effet sauvegardé

Les fichiers sont généralement fermés automatiquement par le système d’exploitation (à moins que le programme ait été anormalement interrompu).

En C: fclose(outfile); En C++: outfile.close();

Page 9: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

9

Lecture

Read(Source_file, Destination_addr, Size) Source_file = location à laquelle le programme

commence sa lecture (i.e., son nom de fichier logique)

Destination_addr = la première addresse du bloc de mémoire dans lequel les données seront sauvegardées

Size = la quantité d’information arrivant du fichier (le nombre d’octets -- MBs)

Page 10: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

10

Lecture en C

char c; // un charactère

char a[100]; // un array avec 100 charactères FILE * infile; infile = fopen("monfichier”,"r"); fread(&c,1,1,infile); /* lis un charactère */ fread(a,1,10,infile); /* lis 10 charactères */

Argument de fread: 1er argument: adresse de destination (adresse de c) 2ème argument: taille de l’élément en bytes (un char =1 byte) 3ème argument: nombre d’élément à lire 4ème argument: nom logique du fichier à lire

Page 11: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

11

Lecture en C++

char c; // un charactère

char a[100]; // un array avec 100 charactères fstream infile; infile.open("monfichier”,ios::in); infile >> c; // lis un charactère infile.read(&c,1) // une autre manière de lire un char. infile.read(a,10); // lis 10 charactères

Note: C++ fournit une méthode read correspondant à

la fonction read de C.

Page 12: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

12

Ecriture

Write(Destination_file, Source_addr, Size)

Destination_file = le nom du fichier logique dans lequel les données seront écrites

Source_addr = la première addresse du bloc de mémoire dans lequel les données qui vont être écrites sont sauvegardées

Size = Le nombre d’octets qui seront écrits dans le fichier

Page 13: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

13

Ecriture en C

char c; char a[100];

FILE * outfile; outfile = fopen("mynew.txt","w"); /* Nous omettons d’initialiser c et a */ fwrite(&c,1,1,outfile);

fwrite(a,1,10,outfile);

Page 14: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

14

Ecriture en C ++

char c; char a[100];

fstream outfile; outfile.open("mynew.txt",ios::out); // Nous omettons d’initialiser c et a outfile << c; outfile.write(&c,1); outfile.write(a,10);

Page 15: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

15

Détection de la fin d’un fichier

Tester si un fichier est à la fin comme suit: • En C: int i; i = fread(&c,1,1,infile); // essaie de lire if (i==0) // true si le fichier est à la fin ….

• En C++: infile >> c; // essaie de lire if (infile.fail()) // true si le fichier est à la fin ...

Page 16: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

16

Recherche La lecture n’est pas confinée un processus séquentiel:

un saut peut être fait à des locations spécifiques dans le fichier ou jusqu’au bout du fichier afin d’y ajouter (“append”) de l’information.

Un déplacement direct jusqu’à une position spécifique dans un fichier s’appelle recherche (“seeking”).

Seek(Source_file, Offset) Source_file = le nom du fichier logique dans lequel

la recherche va pendre place. Offset = le nombre de positions dans le fichier que

le pointeur dépassera à partir du début du fichier.

Page 17: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

17

Programme manipulant des fichiers

Exemple de programme pour afficher le contenu d’un fichier sur l’écran – version C

#include <stdio.h>main() { char ch; FILE * infile;

infile = fopen("A.txt","r");

while (fread(&ch,1,1,infile) != 0) fwrite(&ch,1,1,stdout); fclose(infile);}

Page 18: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

18

Programme – version C++ #include <fstream.h>

main() { char ch; fstream infile; // declare un nom logique

infile.open("A.txt",ios:in); // attache le nom logique a un nom physique infile.unsetf(ios::skipws); // flag pour inlure les “blanks” dans la lecture infile >> ch; while (! infile.fail()) { cout << ch ; infile >> ch ; } infile.close();}

Page 19: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

19

Caractères spéciaux

Parfois, le système d’exploitation essaie de rendre la vie des usagers “reguliers” plus facile en ajoutant ou effacant certains caractères automatiquement.

Ces modifications, néanmoins, rendent la vie des programmeurs bien plus compliquée.

Il est important de se souvenir que de telles situations peuvent fréquemment arriver.

Page 20: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

20

Caractères spéciaux: exemples

Control-Z est ajouté à la fin de tous les fichiers MS-DOS. Ceci est fait pour signaler la fin d’un fichier.

<Carriage-Return>+<Line-Feed> sont ajoutés à la fin de chaque lignes de fichiers MS-DOS.

<Carriage-Return> est effacé et remplacé par le nombre de caractères par ligne de texte dans les fichiers VMS.

Page 21: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

21

La structure du répertoire de l’Unix

Un grand système informatique contient de nombreux fichiers (parfois des milliers). Ces fichiers doivent être organisés. Dans un système d’exploitation, cette organisation s’appelle le système de fichiers (“file system”).

Le système de fichiers de l’Unix est une organisation des répertoires en arbre. La racine de l’arbre est représentée par le caractère ‘/’ (“slash”.

Chaque répertoire contient des fichiers réguliers et/ou d’autres répertoires.

Le nom d’un fichier sauvegardé dans un répertoire Unix correspond à son nom physique.

Page 22: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

22

La structure du répertoire de l’Unix (suite)

Chaque fichier peut être identifié de façon unique en donnant son cheminement absolu (“absolute path”). Par example: /homes/kiringa/courses/csi2511.

Le répertoire dans lequel vous êtes situé s’appelle le répertoire courant (“current directory”).

On peut aussi se réferrer à un fichier par son cheminement (“path”) relatif au répertoire courant.

‘.’ signifie le répertoire courant et ‘..’ signifie le répertoire parent (“parent directory”).

Page 23: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

23

Péripheriques et fichiers logiques

Unix a une vue très générale de ce qu’est un fichier: pour Unix, un fichier est une séquence d’octets dont ni la location de stockage ni la provenance ne sont importantes.

Les disques ou cassettes magnétiques peuvent être assimilés à des fichiers. De même pour le clavier et la console.

Quelle que soit la forme physique d’un fichier en Unix (que ce soit un fichier réel ou un périphérique), il est représenté de la même façon: par un entier.

Page 24: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

24

stdout, stdin, stderr stdout console

fwrite(&ch, 1, 1, stdout); ou cout << ch;

stdin clavier fread(&ch, 1, 1, stdin); ou cin >> ch;

stderr erreur standard (en fait, la console) Lorsque le compilateur détecte une

erreur, le message d’erreur est écrit dans ce fichier

Page 25: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

25

Redirection et “pipes” d’entrée/sortie

< nom_de_fichier -- rediriger stdin dans “nom_de_fichier” > nom_de_fichier -- rediriger stdout dans “nom_de_fichier” Example: a.out < mon_entrée > ma_sortie Programme1 | Programme2 -- prend le stdout de Programme1 et l’utilise comme stdin pour Programme2 Example: list | sort

Page 26: Gestion de Fichiers Operations de Base en C++ sur les Fichiers

26

Commandes usuelles de fichiers en Unix

cat filenames -- Imprime le contenu des fichiers nommés tail filename -- Imprime les 10 dernières lignes du fichier cp file1 file2 -- copie file1 dans file2 mv file1 file2 -- déplace (renomme) file1 dans file2 rm filenames -- efface les fichiers nommés chmod mode filename -- change le mode de protection des fichiers nommés ls -- Liste le contenu du répertoire mkdir name -- crée un répertoire avec le nom donné rmdir name -- efface le répertoire nommé