#include <stdio.h> // <cstdio> en C++
int fprintf( FILE * stream, const char *format, ... ); // Avant C99 int fprintf( FILE * restrict stream, const char * restrict format, ... ); // A partir de C99
int printf( const char *format, ... ); // Avant C99 int printf( const char * restrict format, ... ); // A partir de C99
int sprintf( char * buffer, const char *format, ... ); // Avant C99 int sprintf( char * restrict buffer, const char * restrict format, ... ); // A partir de C99
Ces trois fonctions sont à la fois proches et différentes. Le point commun, c'est qu'elles permettent toutes de formater des données à partir
d'un langage de formatage simple et efficace. Par contre, la chaîne formatée n'est pas forcément envoyées dans un stream (du moins pour
sprintf
).
La fonction fprintf
envoie la chaîne formatée dans un flux de caractère. En réalité, la fonction printf
est très proche
de la précédente dans le sens ou le flux est imposé : il s'agit de stdout
. Par contre, sprintf
stocke la chaîne
formatée en mémoire dans un buffer pré-alloué.
Comment fonctionne le langage de formatage ? En fait c'est relativement simple : une chaîne de caractères définie des points d'injections
pour les paramètres qui sont passés à la suite du paramètres de format. Ces points d'injections sont typés et éventuellement formatés. Par
exemple, le format "[%d/%d]"
spécifie qu'on cherche à injecter deux paramètres de type entier à la gauche et à la droite du caractère
/
. Ainsi, l'appel printf("[%d/%d]", 3, 4)
affichera la chaîne [3/4]
sur stdout
.
Le tableau suivant vous propose quelques syntaxes de points d'injection relativement classiques. Vous pouvez bien entendu cumuler autant de points d'injections dans votre format que nécessaire (pour peu, bien entendu, que vous passiez ensuite les valeurs attendues en paramètres). Voici quelques exemples de formats.
Format | Description |
---|---|
%d |
Une donnée entière de type int |
%3d |
Une donnée entière de type int. Si la valeur est inférieure à 100, des caractères blancs sont ajoutés pour compléter sur 3 caractères. |
%03d |
Une donnée entière de type int. Si la valeur est inférieure à 100, des caractères 0 sont ajoutés pour compléter sur 3 caractères. |
%ld |
Une donnée entière de type long. |
%lu |
Une donnée entière de type long non signée. |
%x |
Une donnée entière affichée en héxadécimal (ff , par exemple). |
%X |
Une donnée entière affichée en héxadécimal et en majuscules (FF , par exemple). |
%f |
Une donnée décimale de type float. |
%lf |
Une donnée décimale de type double. |
%5.2lf |
Une donnée décimale de type double, affichée au total sur cinq caractères (. compris) et avec deux chiffres après le caractère de séparation. |
%g |
Une donnée décimale de type double, affichée de manière la plus compacte possible. Le choix entre la notation exponentielle ou décimale est automatiquement réalisé pour obtenir l'affichage le plus concis. La partie décimale n'apparait que si elle contient au moins un chiffre. |
%c |
Une donnée de type caractère. |
%s |
Une donnée de type chaîne de caractères. |
%10s |
Une donnée de type chaîne de caractères sur 10 caractères alignés par la droite. |
%-10s |
Une donnée de type chaîne de caractères sur 10 caractères alignés par la gauche. |
%p |
Une donnée de type adresse en mémoire. Cette adresse sera présentée sous forme hexadécimale. |
sprintf
, permet de spécifier l'emplacement mémoire dans lequel stocker la
nouvelle chaîne formatée à produire.
Dans tous les cas, soit le nombre de caractères produit dans la chaîne formatée vous sera renvoyée, soit, en cas d'erreur, la valeur EOF sera renvoyée.
Il vous faudra alors consulter la variable errno
pour obtenir de plus amples informations sur l'erreur constatée.
#include <stdio.h> #include <stdlib.h> int main( int argc, char * argv[] ) { FILE * inputFile; argc--; argv++; if ( argc == 0 ) { printf( "Usage: sample filename...\n" ); exit( 0 ); } inputFile = fopen( argv[0], "a" ); if ( inputFile == NULL ) { fprintf( stderr, "Cannot open file %s\n", argv[0] ); exit( 0 ); } fprintf( inputFile, "Appending a new message in the file\n" ); fclose( inputFile ); return 0; }
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :