Algorithmique et Langage C
www.polytech.unice.fr/žvg/index-xidian.html
Granet Vincent - Vincent.Granet@univ-cotedazur.fr
Xi’an - Octobre 2019 - Avril 2020
Problème
1 Les données que manipule un programme sont placées en mémoire centrale etdisparaissentà la fin de son exécution.
2 la mémoire centrale de l’ordinateur a une capacité finie, et un programme ne pourra pas mémoriser des données d’une taille supérieureà celle de la mémoire centrale.
Solution
les fichierspermettent de conserver de l’information sur des supports externes (e.g.disques), et utilisent les mécanismes d’entrée/sortiedu SGF sous-jacent
il existe plusieursmodèlesde fichiers. Nous étudierons ici le modèle
Définition
Les fichiersséquentiels modélisent la notion desuite d’éléments telles que l’on ne peut accéder à un élément qu’après avoir accédé à tous ceux qui le précédent.
Opérations
Les opérations de base sont lalectureet l’écriture. À tout moment,un seul élément est accessible à la fois, qui est à laposition courante.
Les opérations de lecture ou d’écriture, permettent de modifier cette position courante pour accéder à l’élément suivant.
son
Déclaration
v a r i a b l e f : f i c h i e r de T
Le typeTdes éléments est quelconque (sauf, en général, fichier,i.e.pas de fichier de fichiers)
Le nombre d’éléments d’un fichiern’est pas fixépar la déclaration. Il pourravarier.
Ci-dessous, la variable chentest un fichier d’entiers
v a r i a b l e fichent : f i c h i e r de entier
Notation
Pour exprimer lasémantiquedes opérations sur un fichierf deT, on définit :
&l’opérateur de concaténation ; f↑l’élément à la position courante
←
f tous les éléments qui précèdent la position courante
→
f tous les éléments à partir de la position courante
f=←f&→f, etf↑= premier(→f) f=<3 6−21 17>,f=<>
fdf(f)⇒→f =<>
son
Mode écriture
Ouverture :initÉcriture
{} initÉcriture(f) { f=<> et fdf(f) }
Écriture :écrire
{ f=x,e=t∈T,fdf(f) } écrire(f, e) { f=x &<t>,fdf(f) }
+fdf(f)est toujoursvraiavant et après une écriture Fermeture :fermer
{ f=←f } fermer(f) { f=←f et f↑ n'est plus accessible }
Création de fichiers : algorithme
v a r i a b l e f : f i c h i e r de T {initialisation}
initÉcriture(f) t a n t q u e B f a i r e
{calculer un nouvel élément de type T } calculer(e)
{l'écrire à la fin du fichier}
écrire(f,e) f i n t a n t q u e fermer(f)
son
Création de fichiers : exemple
{ création d'un fichier de n entiers tirés aléatoirement}
v a r i a b l e f : f i c h i e r de entier
{Antécédent : n>0}
{Conséquent : i=n et f suite de n entiers tirés au hasard}
initÉcriture(f) i ← 0
t a n t q u e i 6= n f a i r e i ← i + 1
écrire(f,random()) f i n t a n t q u e
fermer(f)
Mode lecture
Ouverture :initLecture
{f=<>} initLecture(f) { fdf(f) et ←f=→f=<> }
ou
{f=x } initLecture(f) { f=→f,←f=<>, non fdf(f),f↑= premier(x) }
Fermeture :fermer
{ f=←f } fermer(f) { f=←f,f↑ n'est plus accessible }
son
Mode lecture Lecture :lire
{←f=x,→f=<t>, non fdf(f),f↑=t } lire(f,e)
{←f=x&<t>,→f=<>,fdf(f),e=t }
ou
{←f=x,→f=<t>&y, non fdf(f),f↑=t } lire(f,e)
{←f=x&<t>,
→
f=y, non fdf(f),f↑= premier(y),e=t }
Consultation de fichiers : algorithme
{initialisation}
InitLecture(f)
t a n t q u e non fdf(f) f a i r e
{ f↑ est l'élément courant du fichier lu}
lire(f,e) traiter(e) f i n t a n t q u e { fdf(f) } fermer(f)
son
Consultation de fichiers : exemple
{pré−condition : f fichier de réels}
{post−condition : somme = somme des réels contenus dans le fichier f } f o n c t i o n somme(donnée f : f i c h i e r de réels) : réel
v a r i a b l e s e, som: réels InitLecture(f)
som ← 0
t a n t q u e non fdf(f) f a i r e
{som = somme des éléments de ←f et non fdf(f)}
lire(f, e) som ← som + e f i n t a n t q u e
{ som = somme des éléments de f etfdf(f) } fermer(f)
r e n d r e som
Fichiers de texte
rôle fondamental dans la communication entre le programme et les utilisateurs humains
fichier decaractèresqui possède une structure de lignes (suite de lignes) - prédicatfdln
possibilités de lectures ou d’écritures de valeurs différentes du type caractères⇒conversionsde type
v a r i a b l e f : f i c h i e r de texte écrire(f, 125) ⇒ '1' '2 '5'
fichiersstandard:entréestandard,sortiestandard etsortie d’erreur standard
son
Les fichiers en C
mis en œuvre par le support d’exécution
un fichier est vu comme unesuite linéaire d’octetssans structure particulière
les éléments d’un fichierne sont donc pas typés, c’est au programmeur d’en assurer la gestion
FILEdescripteur de fichier défini dansstdio.h EOFcette constante représente la fin de fichier son
Ouverture
FILE fopen(const char f, const char m)pour ouvrir le fichier de nomfselon le modem("r","w", ...)
renvoie unpointeursur le descripteur de fichier ouvert, ouNULLen cas d’erreur
Fermeture
int fclose(FILE fd)pour fermer le fichier de descripteurfd renvoie0si pas d’erreur de fermeture, etEOFen cas d’erreur son
Exemple
# i n c l u d e <stdio.h>
# i n c l u d e <stdlib.h>
# i n c l u d e <errno.h>
....
FILE in;
// ouvrir le chier "nom_ chier" en lecture i f ((in = fopen("nom_fichier", "r")) == NULL) {
perror("nom_fichier");
exit(errno);
}
.... // lire les éléments du chier // fermer le chier
i f (fclose(in)==EOF) { perror("nom_fichier");
exit(errno);
fgetc et fputc
int fgetc(FILE fd)renvoie le prochain octetlusur le fichier de descripteurfd, ouEOFen fin de fichier
int fputc(int c, FILE fd)écritl’octetcdans le fichier de descripteurfdet renvoie l’octet écrit ouEOFen cas d’erreur
int ungetc(int c, FILE fd)remet le caractèrecdans le fichier de descripteurfdet renvoie l’octetcouEOFen cas d’erreur
rappel: en C le typecharesttoujourscodé sur 8 bits.
problème:EOFbien souvent égal à -1
représentation du typechar: signée, non signée, pseudo-non signée
son
Exemple
FILE in, out;
i n t c;/ et pas de type char !!!! /
// ouverture des chiers ....
// recopie de in dans out
w h i l e ((c=fgetc(in))!=EOF)
fputc(c, out);
// fermeture des chiers ....
fread et fwrite
le type des éléments d’un fichier doit être géré par le programmeur int fread(void ptr, int s, int n, FILE fd)lits×noctets depuis le flotfdet les range à l’adresseptr
int fwrite(void ptr, int s, int n, FILE fd)prends×n octets à l’adresseptret lesécritdans le flotfd
ces 2 fonctions renvoient le nombre d’élémentseffectivementlus ou écrits.
lafin de fichierest déterminée par une valeur de retour defreadégale à 0
mais aussi avec la fonction booléenneint feof(FILE fd) son
Création d’un fichier de n entiers longs
/
Rôle : crée le fichier f avec n entiers tirés de façon aléaoire /
v o i d creerFich(c h a r f, i n t n) { FILE fd;
// ouvrir le chier "f" en écriture i f ((fd = fopen(f, "w")) == NULL) {
perror(f);
exit(errno);
}
srandom(times(NULL));
f o r (i n t i=0; i<n; i++) {
l o n g x = random();
fwrite(&x, s i z e o f(l o n g), 1, fd);
}
/
Rôle : renvoie le nombre d'entiers pairs contenus dans f /
i n t nbEntiersPairs(c h a r f) {
FILE fd;
i n t n=0; l o n g x;
// ouvrir le chier "f" en lecture i f ((fd = fopen(f, "r")) == NULL) {
perror(f);
exit(errno);
}
w h i l e (fread(&x, s i z e o f(l o n g), 1, fd)>0) i f ((x&1)==0) n++;
// n de chier de fd fclose(fd);
r e t u r n n;
}
fgets et fputs
pour lire ou écrire une chaîne de caractères
char fgets(char s, int n, FILE fd)lit au plusncaractères dans le flotfdet renvoie une chaîne formée de ces caractères.'\0'est ajouté
int fputs(const char s, FILE fd)écrit dans le flotfdla chaîne de caractèress. En cas d’erreur. le fonction renvoieEOF
son
fputs
/ Rôle : écrit la chaîne s dans le flot fd / i n t fputs (c o n s t c h a r s, FILE fd) {
c o n s t i n t lg = strlen (s);
r e t u r n fwrite(s, 1, lg, fd)!=lg ? EOF : 0;
}
son
Fichiers de texte pas de type prédéfini
simples fichiers de caractères (fgetc,fputc) fin de ligne'\n'
entrées/sorties formatéesfprintfetfscanf
directives de conversion,e.g."%d","%f","%lf","%c","%s", ... et des modificateurs,e.g."%2.1f", ...
son
i n t fprintf(FILE fd, c o n s t c h a r format, ...)
i n t fscanf(FILE fd, c o n s t c h a r format, ...)
ces 2 fonctions renvoient le nombre de valeurs écrites ou lues, ouEOF en cas d’erreur
Exemple
FILE in, out;
i n t n;
c h a r nom[MAX];
...
fscanf(in, "%s %d", nom, &n);
fprintf(out, "%s %d\n", nom, n);
Fichiers standard
entrée standard (stdin) sortie standard (stdout) sortie erreur standard (stderr)
/ fonctions d'écriture sur stdout / i n t putchar(i n t c)
i n t puts(c h a r s)
i n t printf(c o n s t c h a r format, ...) / fonctions de lecture sur stdin / i n t getchar(v o i d)
c h a r gets(c h a r s);
fichiers standard : exemple
c h a r nom[MAXALPHA];
d o u b l e note1, note2;
// parcourir l'entrée standard.
// chaque ligne contient un nom et 2 notes (double)
w h i l e (scanf("%s %lf %lf", nom, ¬e1, ¬e2)>0) // écrire sur la sortie standard le nom et la // moyenne des 2 notes
printf("%s %.2f\n", nom, (note1+note2)/2);
son