© Éditions Eyrolles
185
chapitre n° 10
Les fichiers
passe, par exemple, en Turbo Pascal, dans lequel la détection de fin de fichier fonctionne en
quelque sorte par anticipation) ; c’est ce qui explique que nous ayons examiné cette condition
après l’appel de fread et non avant.
On pourrait remplacer la boucle while par la construction (moins concise) suivante :
do
{ fread (&n, sizeof(int), 1, entree) ;
if ( !feof(entree) ) printf ("\n%d", n) ;
}
while ( !feof(entree) ) ;
N’oubliez pas que le premier argument des fonctions fwrite et fread est une adresse. Ainsi,
lorsque vous aurez affaire à un tableau, il faudra utiliser simplement son nom (sans le faire précéder de &), tandis qu’avec une structure il faudra effectivement utiliser l’opérateur & pour en
obtenir l’adresse. Dans ce dernier cas, même si l’on ne cherche pas à rendre son programme
portable, il sera préférable d’utiliser l’opérateur sizeof pour déterminer avec certitude la taille
des blocs correspondants.
fread fournit le nombre de blocs effectivement lus (et non pas le nombre d’octets lus). Ce
résultat peut être inférieur au nombre de blocs demandés soit lorsque l’on a rencontré une fin
de fichier, soit lorsqu’une erreur de lecture est apparue. Dans notre précédent exemple d’exécution,
fread fournit toujours 1, sauf la dernière fois où elle fournit 0.
3 L’accès direct
Les fonctions fread et fwrite lisent ou écrivent un certain nombre d’octets dans un fichier,
à partir d’une position courante. Cette dernière n’est rien d’autre qu’un « pointeur » dans le
fichier, c’est-à-dire un nombre précisant le rang du prochain octet à lire ou à écrire. (Le terme
de « pointeur » n’a pas exactement le même sens que celui de pointeur tel qu’il apparaît en
langage C. En effet, il ne désigne pas, à proprement parler, une adresse en mémoire, mais un
emplacement dans un fichier. Pour éviter des confusions, nous parlerons de « pointeur de
fichier »). Après chaque opération de lecture ou d’écriture, ce pointeur se trouve incrémenté
du nombre d’octets transférés. C’est ainsi que l’on réalise un accès séquentiel au fichier.
Mais il est également possible d’agir directement sur ce pointeur de fichier à l’aide de la fonction fseek. Cela permet ainsi de réaliser des lectures ou des écritures en n’importe quel point
du fichier, sans avoir besoin de parcourir toutes les informations qui précèdent. On peut ainsi
réaliser ce que l’on nomme généralement un « accès direct ».
Delannoy Livre.book Page 185 Mercredi, 6. mai 2009 4:26 16
185
chapitre n° 10
Les fichiers
passe, par exemple, en Turbo Pascal, dans lequel la détection de fin de fichier fonctionne en
quelque sorte par anticipation) ; c’est ce qui explique que nous ayons examiné cette condition
après l’appel de fread et non avant.
On pourrait remplacer la boucle while par la construction (moins concise) suivante :
do
{ fread (&n, sizeof(int), 1, entree) ;
if ( !feof(entree) ) printf ("\n%d", n) ;
}
while ( !feof(entree) ) ;
N’oubliez pas que le premier argument des fonctions fwrite et fread est une adresse. Ainsi,
lorsque vous aurez affaire à un tableau, il faudra utiliser simplement son nom (sans le faire précéder de &), tandis qu’avec une structure il faudra effectivement utiliser l’opérateur & pour en
obtenir l’adresse. Dans ce dernier cas, même si l’on ne cherche pas à rendre son programme
portable, il sera préférable d’utiliser l’opérateur sizeof pour déterminer avec certitude la taille
des blocs correspondants.
fread fournit le nombre de blocs effectivement lus (et non pas le nombre d’octets lus). Ce
résultat peut être inférieur au nombre de blocs demandés soit lorsque l’on a rencontré une fin
de fichier, soit lorsqu’une erreur de lecture est apparue. Dans notre précédent exemple d’exécution,
fread fournit toujours 1, sauf la dernière fois où elle fournit 0.
3 L’accès direct
Les fonctions fread et fwrite lisent ou écrivent un certain nombre d’octets dans un fichier,
à partir d’une position courante. Cette dernière n’est rien d’autre qu’un « pointeur » dans le
fichier, c’est-à-dire un nombre précisant le rang du prochain octet à lire ou à écrire. (Le terme
de « pointeur » n’a pas exactement le même sens que celui de pointeur tel qu’il apparaît en
langage C. En effet, il ne désigne pas, à proprement parler, une adresse en mémoire, mais un
emplacement dans un fichier. Pour éviter des confusions, nous parlerons de « pointeur de
fichier »). Après chaque opération de lecture ou d’écriture, ce pointeur se trouve incrémenté
du nombre d’octets transférés. C’est ainsi que l’on réalise un accès séquentiel au fichier.
Mais il est également possible d’agir directement sur ce pointeur de fichier à l’aide de la fonction fseek. Cela permet ainsi de réaliser des lectures ou des écritures en n’importe quel point
du fichier, sans avoir besoin de parcourir toutes les informations qui précèdent. On peut ainsi
réaliser ce que l’on nomme généralement un « accès direct ».
Delannoy Livre.book Page 185 Mercredi, 6. mai 2009 4:26 16
