« Programmation C/Entrées/sorties » : différence entre les versions

Contenu supprimé Contenu ajouté
Tavernierbot (discussion | contributions)
m Robot : Corrige les liens pointants sur des redirections
Thierry46 (discussion | contributions)
→‎Sorties formatées : Prototype C99 et diverses corrections
Ligne 155 :
== Sorties formatées ==
<source lang="c">
int printf(const char * restrict format, ...);
int fprintf(FILE * restrict flux, const char * restrict format, ...);
int sprintf(char * restrict chaine, const char * fluxrestrict format, ...);
int snprintf(char * restrict chaine, intsize_t taille, const char * fluxrestrict format, ...);
</source>
 
Ligne 170 :
Bien que cela à déjà été traité dans la section dédiée aux chaines de caractères, il faut faire très attention avec la fonction <code>sprintf()</code>. Dans la mesure où la fonction n'a aucune idée de la taille de la zone mémoire transmise, il faut s'assurer qu'il n'y aura pas de débordements. Mieux vaut donc utiliser la fonction <code>snprintf()</code>, qui permet de limiter explicitement le nombre de caractère à écrire.
 
À noter que <code>snprintf()</code> devrait toujours retourner la taille de la chaine à écrire, indépendemmentindépendamment de la limite fixée par le paramètre <code>taille</code>. Le conditionnel reste de mise, car beaucoup d'implémentations de cette fonction se limitent à retourner le nombre de caractères ''écrit'', c'est à dire en s'arrêtant à la limite le cas échéant.
 
=== Type de conversion ===
Ligne 242 :
* ll : cet attribut ne concerne que les types entiers, où le type attendu sera <code>long long int</code>.
* L : pour les types réels, le type attendu sera <code>long double</code>.
* z pour afficher une variable de type ''size_t''.
 
Pour résumer les types d'arguments attendus en fonction de l'indicateur de taille et du type de conversion :
Ligne 282 ⟶ 283 :
 
<source lang="c">
printf( gettext("La chaine `'%s' a %dzu caractères\n"), s, strlen(s) );
</source>
 
Ligne 288 ⟶ 289 :
 
Une traduction en allemand du message précédant, pourrait donner :
<code>"%d Zeichen lang ist die Zeichenkette `'%s'"</code>
 
On remarque d'emblée que les spécificateurs de format sont inversés par rapport à la chaine originale. Or l'ordre des arguments passés à la fonction <code>printf()</code> sera toujours le même. Il est quand même possible de s'en sortir avec les arguments positionnels. Pour cela, il suffit d'ajouter à la suite du caractère <code>%</code> un nombre, suivitsuivi d'un signe <code>$</code>. Ce nombre représente le numéro de l'argument à utiliser pour le spécificateur, en commençant à partir de 1. Un petit exemple :
 
<source lang="c">
char * s = "Bla bla";
printf("La chaine %2$s a %1$dzu caractères\n", strlen(s), s); /* "La chaine Bla bla a 7 caractères" */
</source>
 
Ligne 314 ⟶ 315 :
 
<source lang="c">
int setvbuf( FILE * restrict flux, char * restrict mem, int mode, intsize_t taille );
</source>
 
Cette fonction doit être appelée juste '''après''' l'ouverture du flux et '''avant''' la première écriture. Les arguments ont la signification suivante :
* <code>flux</code> : Le flux <code>stdio</code> pour lequel vous voulez changer la méthode d'écriture.
* <code>mem</code> : Vous pouvez transmettre une zone mémoire qui sera utilisée pour stocker les données avant d'être écrites dans le fichier. Vous pouvez aussi passer la valeur <code>NULL</code>, dans ce cas les fonctions <code>stdio</code>, appelerontappelleront la fonction <code>malloc()</code> lors de la ''première'' écriture.
* <code>mode</code> : indique comment se feront les écritures :
** <code>_IONBF</code> : écriture immédiate, pas de stockage temporaire.