SETVBUF |
Fixer la virtualisation du tampon |
---|---|
Langage C++ | cstdio (stdio.h) |
Syntaxe
int setvbuf(FILE *ptrfichier,char *tampon,int mode,size_t taille) |
Paramètres
Nom | Description | |
---|---|---|
ptrfichier | Ce paramètre permet d'indiquer l'identificateur de fichier | |
tampon | Ce paramètre permet d'indiquer le tampon de données | |
mode | Ce paramètre permet d'indiquer le mode : | |
Constante | Description | |
_IONBF | Pas de tampon | |
_IOLBF | Ligne de tampon | |
_IOFBF | Tampon complet | |
taille | Ce paramètre permet d'indiquer la taille du tampon |
Description
Cette fonction permet de créer un tampon de fichier.
Remarques
- La fonction setvbuf() permet au programmeur de spécifier le tampon, sa taille et son mode pour le flux de données spécifié. Le tableau de caractères pointé par tampon est utilisé comme tampon de flux de données pour les opérations d'entrée/sortie. La taille de la mémoire tampon est définie par la taille et le mode détermine comment la mise en mémoire tampon sera gérée. Si tampon est null, alors la fonction setvbuf() allouera son propre tampon.
- Les valeurs légales de mode sont _IOFBF, _IONBF et _IOLBF. Ceux-ci sont définis dans cstdio. Lorsque le mode est défini sur _IOFBF, une mise en mémoire tampon complète a lieu. Si le mode est _IOLBF, le flux sera mis en mémoire tampon de ligne, ce qui signifie que le tampon sera vidé chaque fois qu'un caractère de nouvelle ligne est écrit pour les flux de données de sortie; pour les flux d'entrée, une demande d'entrée lit tous les caractères jusqu'à une nouvelle ligne. Dans les deux cas, le tampon est également vidé lorsqu'il est plein.
- Si le mode est _IONBF, aucune mise en mémoire tampon n'a lieu. La valeur de la taille doit être supérieure à zéro.
- La fonction setvbuf() retourne zéro en cas de succès, différent de zéro en cas d'échec.
- Définition et utilité : La fonction setvbuf est utilisée pour modifier le mode de mise en mémoire tampon d'un flux (FILE*). Elle permet de spécifier si un flux doit être mis en tampon, ainsi que la taille et le type de tampon utilisé. Cela peut améliorer les performances des entrées/sorties en réduisant le nombre d'appels système.
- Effet sur les performances d'entrée/sortie : L'utilisation du mode _IOFBF (mise en tampon complète) améliore les performances des entrées/sorties en réduisant le nombre d'appels système, notamment lors de l'écriture sur disque. En revanche, _IONBF peut ralentir l'exécution du programme, car chaque opération d'écriture entraîne un accès direct au fichier ou au terminal. Le mode _IOLBF est souvent utilisé pour les sorties vers la console, garantissant que chaque ligne est affichée immédiatement.
- Utilisation d'un tampon personnalisé : Il est possible de fournir un tampon personnalisé au lieu d'utiliser celui alloué par défaut. Cela permet de mieux contrôler l'utilisation de la mémoire et peut être utile dans des environnements à ressources limitées. Exemple :
- Conséquences sur les flux standard (stdin, stdout, stderr) : Par défaut, stdout est en mode _IOLBF (tamponné par ligne) sauf si redirigé vers un fichier, où il passe en _IOFBF. stderr est toujours en _IONBF (pas de mise en tampon) pour garantir que les erreurs sont immédiatement visibles. Modifier le mode de stdin ou stdout avec setvbuf peut aider à ajuster les performances selon l'application.
- Limitations et erreurs courantes : setvbuf doit être appelé avant toute opération sur le flux (lecture, écriture). Une fois le flux utilisé, le mode de tamponnage ne peut plus être modifié. Si un tampon personnalisé est utilisé, il doit rester valide aussi longtemps que le flux est ouvert. Ne pas libérer un tampon personnalisé avant la fermeture du fichier. En cas d'échec, la fonction retourne une valeur non nulle, ce qui doit être vérifié pour éviter des comportements indéfinis.
- Impact sur la lecture de fichiers : Lorsqu'un fichier est lu avec mise en tampon complète (IOFBF), il est possible que plusieurs blocs soient préchargés en mémoire, rendant fseek moins précis dans certains cas. Si un fichier binaire est lu avec un grand tampon, cela réduit les appels système et améliore les performances. Pour des fichiers très volumineux, il peut être utile d'augmenter la taille du tampon pour optimiser la lecture.
- Alternative avec std::ios::sync_with_stdio(false) en C++ : En C++, setvbuf est principalement utilisé avec les flux FILE*. Cependant, si vous utilisez std::cin et std::cout, il existe une autre optimisation pour désynchroniser ces flux et améliorer leurs performances :
- std::ios::sync_with_stdio(false);
Ici, stdout utilisera myBuffer comme tampon au lieu d'en allouer un lui-même.
Cela désactive la synchronisation entre les flux C (printf, scanf) et C++ (cin, cout), ce qui améliore considérablement la vitesse des entrées/sorties en C++.
Exemple
Exemple d'utilisation :
- setvbuf(stdout, NULL, _IONBF, 0); // Désactive la mise en tampon sur stdout
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - fflush
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 - setbuf
Langage de programmation - C - Référence de procédures et fonctions - setvbuf
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 734.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 236.