FREAD |
Lecture dans le fichier |
---|---|
Langage C | stdio.h |
Syntaxe
int fread(void *tampon,size_t taille,size_t n,FILE *ptrfichier); |
Paramètres
Nom | Description |
---|---|
ptrfichier | Ce paramètre permet d'indiquer l'identificateur de fichier |
tampon | Ce paramètre permet d'indiquer le bloc de données à lire |
n | Ce paramètre permet d'indiquer le nombre de bloc de données |
taille | Ce paramètre permet d'indiquer la taille du bloc de données |
Retour
Valeur | Description |
---|---|
0 | Cette valeur permet d'indiquer qu'il n'y a pas eu de lecture de données ou une erreur s'est produite. |
supérieur à 0 | Ces valeurs permettent d'indiquer le nombre d'octets ayant réellement lu dans le fichier. |
inférieur à 0 | Ces valeurs peuvent être retourner par certains compilateurs, comme dans une situation d'erreur par exemple, mais ils ne font pas partie de la documentation officielle. |
Description
Cette fonction effectue la lecture d'un bloc de mémoire de taille n*taille octets dans un fichier. Ainsi, grâce à cette fonction, il est possible de lire dans un fichier du contenu d'images binaires, des vidéos, des fichiers musicaux, des archives compressés ou de structure de données numérisés (base de registres, tableur, traitement de texte,...).
Algorithme
MODULE FREAD(ptr, size, count, stream) SI stream est NULL ALORS * Erreur : flux non valide RETOURNE 0 FIN SI SI ptr est NULL ALORS * Erreur : pointeur de tampon invalide RETOURNE 0 FIN SI SI le fichier n'est pas accessible en mode lecture ALORS * Erreur : fichier non ouvert en lecture RETOURNE 0 FIN SI Initialiser un compteur de lecture bytes_read à 0 BOUCLE POUR i ← 1 JUSQU'À count FAIRE Lire size octets du fichier stream dans ptr SI la lecture échoue ou n'atteint pas size octets ALORS * Retourner le nombre d'éléments lus jusqu'à présent RETOURNE bytes_read FIN SI bytes_read ← bytes_read + 1 FIN BOUCLE POUR * Retourne le nombre d'éléments lus (peut être inférieur à count en cas d'erreur ou de fin de fichier) RETOURNE bytes_read |
Remarques
- ATTENTION ! Vous devez vous assurez d'avoir suffisante d'espace disponible de le tampon spécifié pour contenir la quantité de donnée spécifié car sinon vous aurez des problèmes de corruption mémoire et nécessairement des problèmes d'instabilité de votre programme.
- Longueur de lecture : La longueur de lecture réel peut être différente du nombre d'octets demandé. Ainsi, il lira tous les octets possible dans la longueur spécifié mais s'il atteint la limite du fichier, il arrêtera la lecture. Pour s'assurer du nombre réel d'octets lu, vous devriez plutôt vérifier la valeur de retour de cette fonction.
- Emplacement : La lecture commence à l'emplacement actuel du pointeur de fichiers et lorsque la lecture du tampon a été faite, il déplace le pointeur du fichier aux nombres d'octets que vous avez demander de lire, cependant, si la fin du fichier est atteinte, le pointeur se déplacera à la fin du fichier.
- Utilisation : On utilise généralement cette fonction afin de lire des données binaires ou brute ou ayant une taille bien précise. Ainsi, il sera aisé de lire un bloc de données, une structure de données ou une image mais il ne se révélera pas très pratique pour la lecture d'une chaîne de caractères par exemple. De plus, il n'y a pas d'interprétation des données du contenu du tampon lu par cette fonction.
- Optimisation : Lorsque vous avez plusieurs appels se succédant, vous devriez tentez de les regrouper et de charger la structure en un seul appel de cette fonction. Chaque appel à cette fonction est longue, cependant, que vous lisez 1, 2 ou 500 octets en seul passage, le délai est le même. Donc, de ce fait, si vous avez à lire, 4 octets ce succédant mais avec des données différentes, il est préférable de créer une structure avec 4 champs et de lire la structure de 4 champs en un seul appel.
- Vous devez utilisez la fonction «ferror» pour savoir si une erreur de lecture s'est produit.
- Lecture séquentielle de fichiers binaires : La fonction fread est principalement utilisée pour lire des blocs de données brutes dans des fichiers binaires. Contrairement à des fonctions comme fgets ou fscanf, elle ne fait aucune interprétation des données, ce qui la rend idéale pour manipuler des formats de fichiers non-textuels.
- Spécification des tailles de bloc et du nombre d'éléments : fread prend quatre paramètres : le pointeur vers la mémoire où les données seront entreposées, la taille d'un élément, le nombre d'éléments à lire, et le pointeur vers le fichier. Cela permet de lire précisément des structures ou des blocs de données d'une taille spécifique, ce qui est utile pour manipuler des fichiers contenant des enregistrements structurés.
- Compatibilité avec les structures C : fread peut directement remplir des structures en mémoire, tant que la taille et l'alignement de la structure correspondent à ceux attendus dans le fichier. Cependant, cela peut poser des problèmes de portabilité entre systèmes si l'ordre des octets (endianness) ou l'alignement diffèrent.
- Gestion des erreurs et de la fin de fichier : En cas d'échec de lecture, fread retourne un nombre d'éléments inférieur à celui demandé. Pour distinguer une erreur d'une fin de fichier, il est nécessaire d'utiliser les fonctions ferror et feof respectivement, afin d'identifier correctement la cause de l'interruption.
- Utilisation dans les boucles de lecture : fread est souvent utilisée dans des boucles pour traiter des fichiers volumineux en lisant par blocs. Cela réduit la surcharge des opérations d'entrée/sortie en traitant plusieurs éléments à la fois, plutôt qu'un élément unique par appel.
- Problèmes potentiels avec les tampons : Comme avec toutes les opérations basées sur FILE*, fread utilise un tampon interne pour optimiser les opérations de lecture. Cependant, dans des environnements multi-processus léger ou avec des flux partagés, une gestion prudente des tampons est essentielle pour éviter des comportements inattendus. Des alternatives comme des appels système bas niveau (read) peuvent être utilisées dans ces cas.
- Si vous souhaitez lire des images, vous devriez consulter les structures d'images suivantes : .BGX, .BMP, .GEM, .GIF, .IMG, .LBM, .JPEG, .PCX, .PNG, .TGA, .TIFF, ...
- Si vous souhaitez lire des fichiers musicaux, vous devriez consulter les structures sonores suivantes : .669, .AIFF, .AU, .CMF, .MOD, .MP3, .OGG, .S3M, .WAV...
- Si vous souhaitez lire des archives compressés, vous devriez consulter les structures d'archives suivantes : .ARC, .ARJ, .CAB, .GZIP, .PAK, .RAR, .ZIP, .ZOO,...
Exemple
Prenons pour acquis que le fichier «readtext.txt» est le contenu :
gladir.comVoici un exemple montrant une utilisation plus classique de cette fonction :
Essayer maintenant !
on obtiendra le résultat suivant :
1:gla2:dir
3:.co
Voir également
Langage de programmation - C - Référence de procédures et fonctions - fopen
Langage de programmation - C - Référence de procédures et fonctions - fwrite
Langage de programmation - C - Référence de procédures et fonctions - printf
Langage de programmation - C++ - Référence de procédures et fonctions - fread
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 731.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 111.