Manipulation des fichiers en C avec exercices

Cours manipulation des fichiers en C avec exercices, tutoriel & guide de travaux pratiques langage C en pdf.

Les erreurs d’E/S

Une erreur d’E/S est erreur qui peut se produire lors d’une tentative d’opération d’E/S, par exemple : fin de fichier atteinte, tentative d’écriture dans un fichier ouvert uniquement en lecture, tentative de lecture dans un fichier ouvert uniquement en lecture, etc.
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d’auteurs. Copyright © 2008 – Melem. Aucune reproduction, même partielle, ne peut être faite de ce site et de l’ensemble de son contenu : textes, documents, images, etc sans l’autorisation expresse de l’auteur. Sinon vous encourez selon la loi jusqu’à 3 ans de prison et jusqu’à 300 000 E de dommages et intérêts.

La fonction feof

int feof(FILE * f);
peut être appelé à n’importe quel moment pour connaître si l’on a atteint la fin du fichier. Je rappelle qu’un programme (du moins d’après les fonctions du C) ne peut affirmer que la fin d’un fichier a été atteinte qu’après avoir tenté de lire dans le fichier alors qu’on se trouve déjà à la fin c’est-à-dire derrière le dernier octet, pas juste après avoir lu le dernier octet, donc faites gaffe. Evidemment, une telle fonction ne sera utilisée que sur un fichier ouvert en lecture. Elle retourne VRAI si la fin de fichier a été atteinte et FAUX dans le cas contraire. Cette information est en fait maintenue par un indicateur de fin de fichier qui indique à tout moment si on a oui ou non déjà atteint la fin du fichier. Après un appel fructueux à une fonction de positionnement, l’indicateur de fin de fichier est remis à zéro. La fonction ferror :
int ferror(FILE * f);
permet de connaître si une erreur différente de « fin de fichier atteinte » s’est produite lors de la dernière opération d’E/ S sur f. Cette information est maintenue en permanence par un indicateur d’erreur. Bien qu’une lecture à la fin d’un fichier soit également une erreur, elle n’est pas considérée par la fonction ferror car les indicateurs d’erreur et de fin de fichier sont des données bien distinctes.
Attention, une fois qu’une erreur s’est produite, l’indicateur d’erreur ne sera remis à zéro qu’après un appel à clearerr.
void clearerr(FILE * f);
Cette fonction remet à zéro l’indicateur d’erreur du fichier f.

Positionnement dans un fichier La fonction fseek

int fseek(FILE * f, long offset, int origin);
Permet de modifier la position courante dans un fichier. La nouvelle position dépend des valeurs des arguments offset qui représente le déplacement et origin qui représente l’origine. Les valeurs qu’on peut donner à origin sont :
• SEEK_SET : le pointeur sera ramené à offset caractères par rapport au début du fichier
• SEEK_CUR : le pointeur sera ramené à offset caractères par rapport à la position courante
• SEEK_END : le pointeur sera ramené à offset caractères par rapport à la fin du fichier.
Bien entendu, le déplacement peut être positif ou négatif. Si la fonction réussit, 0 est retourné (une valeur différente de zéro indique donc une erreur).
L’utilisation de cette fonction avec un flux de texte peut donner des résultats inattendus à cause du coup du ‘\n’ … Pour aller au n-ième caractère d’un fichier associé à un flux de texte (ce qui entraîne que la fin de ligne sera vue du programme comme un et un seul caractère : ‘\n’) par exemple, utilisez la méthode suivante :
fseek(f, 0L, SEEK_SET);
for(i = 0; i < n; i++)
getc(f);
/* On est maintenant a la position n dans le fichier */
Cette technique est aussi connue sous le nom d’accès séquentiel, par opposition à accès aléatoire (utilisant fseek, etc.).
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d’auteurs. Copyright © 2008 – Melem. Aucune reproduction, même partielle, ne peut être faite de ce site et de l’ensemble de son contenu : textes, documents, images, etc sans l’autorisation expresse de l’auteur. Sinon vous encourez selon la loi jusqu’à 3 ans de prison et jusqu’à 300 000 E de dommages et intérêts.
Dans la pratique, on ne sera jamais confronté à un tel cas. Bon, « jamais » c’est peut être un peu trop mais en tout cas je peux vous affirmer que je n’ai jamais eu à le faire. Si on doit faire beaucoup de « va et vient » dans un fichier, c’est tout simplement une erreur de l’avoir ouvert en tant que fichier texte.

La fonction ftell

long ftell(FILE * f);
Permet de connaître la position courante dans le fichier. Dans le cas où le fichier est associé à un flux binaire, il s’agit du nombre de caractères entre le début du fichier et la position courante. Si le fichier est associé à un flux de texte, la valeur retournée par cette fonction est tout simplement une information représentant la position actuelle dans le fichier et on ne peut rien dire de plus. Quel que soit le cas, le retour de ftell pourra éventuellement être utilisée dans un futur appel fseek avec SEEK_SET pour revenir à la même position.
Les fonctions fgetpos et fsetpos
La fonction fgetpos permet de sauvegarder la position courante dans un fichier. On pourra ensuite ultérieurement revenir à cette position à l’aide de la fonction fsetpos.
int fgetpos(FILE * f, fpos_t * p_pos);
int fsetpos(FILE * f, const fpos_t * p_pos);
Le type fpos_t est un type limité à usage de ces fonctions. On ne doit passer à fsetpos qu’une valeur obtenue à l’aide de fgetpos. En cas de succès, 0 est retourné.
La fonction rewind
Cette fonction permet de « rembobiner » un fichier.
rewind(f);
est équivalent à :
fseek(f, 0L, SEEK_SET);
clearerr(f);
Position courante
En général, les opérations de lecture (respectivement d’écriture) commencent la lecture (respectivement l’écriture) à partir de la position courante puis ensuite déplacent le pointeur selon le nombre de caractères lus (respectivement écrits). Il existe toutefois des exceptions comme dans le cas ou le fichier est ouvert en mode ajout par exemple, auquel cas toutes les opérations d’écriture se feront à la fin du fichier, indépendamment de la position courante.

Le traitement par blocs

La bibliothèque standard offre également des fonctions permettant de réaliser des opérations d’entrées/sorties par blocs d’octets. Il s’agit des fonctions fread et fwrite.
size_t fread(void * buffer, size_t size, size_t nobj, FILE * f);
size_t fwrite(const void * buffer, size_t size, size_t nobj, FILE * f);
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d’auteurs. Copyright © 2008 – Melem. Aucune reproduction, même partielle, ne peut être faite de ce site et de l’ensemble de son contenu : textes, documents, images, etc sans l’autorisation expresse de l’auteur. Sinon vous encourez selon la loi jusqu’à 3 ans de prison et jusqu’à 300 000 E de dommages et intérêts.
fread lit nobj objets de taille size chacune à partir de la position courante dans f pour les placer dans un buffer. Elle retourne ensuite le nombre d’objets effectivement lus.
A l’inverse fwrite écrit nobj objets de buffer de taille size chacune en destination de f. Elle retourne ensuite le nombre d’objets effectivement écrits.
Par exemple, voici une manière d’écrire « Bonjour » dans un fichier en utilisant fwrite.
#include <stdio.h>
#include <string.h>
int main()
{
FILE * f;
char s[] = « Bonjour »;
f = fopen(« bonjour.txt », « wb »);
if (f != NULL)
{
fwrite(s, sizeof(char), strlen(s), f);
fclose(f);
}
else
perror(« bonjour.txt »);
return 0;
}

Opérations sur les fichiers

Renommer ou déplacer un fichier
La fonction rename :
int rename(const char * oldname, const char * newname);
permet de renommer un fichier lorsque cela est possible. Si la fonction réussit, 0 est retourné.
Supprimer un fichier
La fonction remove :
int remove(const char * filename);
permet de supprimer un fichier. Si la fonction réussit, 0 est retourné.
VI – Les fichiers temporaires
Un fichier temporaire est un fichier utilisé par un programme puis supprimé lorsque celui-ci se termine. La fonction tmpfile :
FILE * tmpfile(void);
permet de créer un fichier en mode « wb+ » qui sera automatiquement supprimé à la fin du programme.
On peut toujours bien sûr créer un fichier temporaire « manuellement ». Dans ce cas, il vaut mieux lui donner un nom généré par tmpnam afin de s’assurer qu’aucun autre fichier porte déjà ce nom.
char * tmpnam(char * name);
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d’auteurs. Copyright © 2008 – Melem. Aucune reproduction, même partielle, ne peut être faite de ce site et de l’ensemble de son contenu : textes, documents, images, etc sans l’autorisation expresse de l’auteur. Sinon vous encourez selon la loi jusqu’à 3 ans de prison et jusqu’à 300 000 E de dommages et intérêts.
Si name est utilisé, il doit pointer sur un buffer d’au moins L_tmpnam octets autrement il est possible qu’elle ne pourra pas contenir le nom généré par cette fonction ce qui va provoquer un débordement de tampon ! On peut tout simplement passer NULL à cette fonction si on n’a pas de buffer à passer en argument.

Rediriger un flux d’E/S

La fonction freopen
FILE * freopen(const char * filename, const char * mode, FILE * f);
ferme le fichier associé au flux f, ouvre le fichier dont le nom est spécifié par filename selon le mode spécifié par mode en lui associant le flux représenté par f puis retourne f ou NULL si une erreur s’est produite. Dans le programme suivant, la sortie standard est redirigée vers le fichier out.txt.
#include <stdio.h>
int main()
{
if (freopen(« out.txt », « w », stdout) != NULL)
{
printf(« Hello, world\n »);
fclose(stdout);
}
else
perror(« out.txt »);
return 0;
}

Enregistrement et chargement de données

Ecrire un programme qui écrit le contenu entier d’un tableau de 10 entiers dans un fichier puis écrire un autre programme qui lit les dix entiers du fichier puis les affiche sur la sortie standard.
 Taille d’un fichier
Ecrire un programme qui affiche la longueur d’un fichier dont le nom sera fourni par l’utilisateur (astuce : utiliser fseek/ ftell).
 Découpage et restitution d’un fichier
Ecrire un programme qui permet de découper un fichier en un ou plusieurs morceaux puis écrire un autre programme qui permet de restituer le fichier original à l’aide des découpes. Une autre possibilité est d’écrire un seul programme avec menu qui permet aussi bien le découpage que la restitution.
Chiffrement et déchiffrement
Chiffrer une information c’est modifier cette information de sorte que l’original ne puisse être restitué que par quelqu’un qui connaît les modifications que celui-ci a subi. La restitution de l’information originale à partir de l’information chiffrée s’appelle le déchiffrement. La cryptographie, branche des mathématiques qui s’intéresse aux techniques de chiffrement, a des applications fondamentales dans la sécurité informatique d’aujourd’hui.
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d’auteurs. Copyright © 2008 – Melem. Aucune reproduction, même partielle, ne peut être faite de ce site et de l’ensemble de son contenu : textes, documents, images, etc sans l’autorisation expresse de l’auteur. Sinon vous encourez selon la loi jusqu’à 3 ans de prison et jusqu’à 300 000 E de dommages et intérêts.
Pour chiffrer une information x, il suffit de trouver une fonction bijective f, transformer x par f(x) et ne communiquer f qu’aux personnes dignes de confiance. Pour restituer x, il suffit évidemment d’appeler f-1(x). La grande problématique de la cryptographie est de trouver une fonction f qui ne soit pas facilement devinable par les gens de l’extérieur. Trouver une méthode simple permettant de chiffrer un fichier et écrire un programme de chiffrement et de déchiffrement de fichier en utilisant cette méthode.

I – Généralités
I-A – La notion de flux
I-B – Les fichiers sur disque
I-C – Les messages d’erreur
I-D – Ouverture d’un fichier
I-E – Exemple : copier un fichier
II – Les erreurs d’E/S
III – Positionnement dans un fichier
La fonction fseek
La fonction ftell
Les fonctions fgetpos et fsetpos
La fonction rewind
Position courante
IV – Le traitement par blocs
V – Opérations sur les fichiers
V-A – Renommer ou déplacer un fichier
V-B – Supprimer un fichier
VI – Les fichiers temporaires
VI – Rediriger un flux d’E/S
VIII – Exercices
VIII-A – Enregistrement et chargement de données
VIII-B – Taille d’un fichier
VIII-C – Découpage et restitution d’un fichier
VIII-D – Chiffrement et déchiffrement
IX – Solutions des exercices
IX-A – Enregistrement et chargement de données (VIII-A)
IX-B – Taille d’un fichier (VIII-B)
IX-C – Découpage et restitution d’un fichier (VIII-C)
IX-D – Chiffrement et déchiffrement (VIII-D)
X – Remerciements

………

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *