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, ... );
int printf( const char *format, ... );
int sprintf( char * buffer, const char *format, ... );

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).

%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.
%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é au total sur cinq caractères (. compris) et avec deux chiffres après le caractère de séparation.
%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