Participer au site avec un Tip
Rechercher
 

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 :

Fonctions fprintf, printf et sprintf

La vidéo


Utilisation des fonctions fprintf, printf et sprintf

Entête à inclure

#include <stdio.h>  // <cstdio> en C++

Fonctions fprintf, printf et sprintf

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.

Paramètres

Valeur de retour

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.

Exemple de code

#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;
}

Sujets connexes

fscanf
scanf
sscanf