E/S formattées sur fichiers next up previous contents index
Suivant: Récréation Début: Les entrées-sorties Précédent: Lecture et écriture par


Paragraphes

E/S formattées sur fichiers

Ecriture formattée : fprintf

 

Utilisation

La fonction fprintf admet un nombre variable de paramètres. Son utilisation est la suivante :

fprintf ( flot-de-données , format , param1 , param2 , ... , paramn )

Sémantique des paramètres

-
flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier sur lequel se fait l'écriture.
-
format est une chaîne de caractères qui spécifie ce qui doit être écrit.
-
parami est une expression délivrant une valeur à écrire.

Valeur rendue

La fonction printf retourne le nombre de caractères écrits, ou une valeur négative si il y a eu une erreur d'entrée-sortie.

Présentation

La chaîne format contient des caractères ordinaires (c'est à dire différents du caractère %) qui doivent être copiés tels quels, et des séquences d'échappement (introduites par le caractère %), décrivant la manière dont doivent être écrits les paramètres param1, param2, ... paramn.  

Si il y a moins de parami que n'en réclame le format, le comportement n'est pas défini. Si il a davantage de parami que n'en nécessite le format, les parami en excès sont évalués, mais leur valeur est ignorée.

Les séquences d'échappement

            Une séquence d'échappement se compose des éléments suivants :



Remarque
Le nombre entier décimal indiquant la taille maximum du champ d'impression et/ou le nombre entier décimal indiquant la précision, peuvent être remplacées par le caractère *. Si le caractère * a été utilisé une seule fois dans le format, la valeur correspondante (taille du champ ou précision) sera prise égale à parami-1. Si le caractère * a été utilisé deux fois, la taille du champ d'impression sera égale à parami-2, et la précision sera égale à parami-1. Si la taille maximum du champ d'impression a une valeur négative, cela a la sémantique de l'indicateur - suivi de la valeur (positive) de la taille du champ d'impression. Si la précision est négative, cela a la sémantique d'une précision absente.


Ecriture formattée : printf

  Nous avons déjà vu printf, mais nous allons la définir ici formellement.

Utilisation

La fonction printf admet un nombre variable de paramètres. Son utilisation est la suivante :

printf ( format , param1 , param2 , ... , paramn )

Description

Un appel printf(fmt, ...) est rigoureusement identique à fprintf(stdout,fmt,...).

Ecriture formattée dans une chaîne : sprintf

 

Utilisation

La fonction sprintf admet un nombre variable de paramètres. Son utilisation est la suivante :

sprintf ( chaîne , format , param1 , param2 , ... , paramn )

Description

La fonction sprintf réalise le même traitement que la fonction fprintf, avec la différence que les caractères émis par sprintf ne sont pas écrits dans un fichier, mais dans le tableau de caractères chaîne. Un nul est écrit dans chaîne en fin de traitement.

Exemples d'utilisation des formats

              source C                       resultat

printf("|%d|\n",1234);                       	|1234|
printf("|%d|\n",-1234);                      	|-1234|
printf("|%+d|\n",1234);                      	|+1234|
printf("|%+d|\n",-1234);                     	|-1234|
printf("|% d|\n",1234);                      	| 1234|
printf("|% d|\n",-1234);                     	|-1234|
printf("|%x|\n",0x56ab);                     	|56ab|
printf("|%X|\n",0x56ab);                     	|56AB|
printf("|%#x|\n",0x56ab);                    	|0x56ab|
printf("|%#X|\n",0x56ab);                    	|0X56AB|
printf("|%o|\n",1234);                       	|2322|
printf("|%#o|\n",1234);                      	|02322|
                                             	
printf("|%10d|\n",1234);                     	|      1234|
printf("|%10.6d|\n",1234);                   	|    001234|
printf("|%.6d|\n",1234);                     	|001234|
printf("|%*.6d|\n",10,1234);                 	|    001234|
printf("|%*.*d|\n",10,6,1234);               	|    001234|
                                             	
printf("|%f|\n",1.234567890123456789e5);     	|123456.789012|
printf("|%.4f|\n",1.234567890123456789e5);   	|123456.7890|
printf("|%.20f|\n",1.234567890123456789e5);  	|123456.78901234567456413060|
printf("|%20.4f|\n",1.234567890123456789e5); 	|         123456.7890|
                                             	
printf("|%e|\n",1.234567890123456789e5);     	|1.234568e+05|
printf("|%.4e|\n",1.234567890123456789e5);   	|1.2346e+05|
printf("|%.20e|\n",1.234567890123456789e5);  	|1.23456789012345674564e+05|
printf("|%20.4e|\n",1.234567890123456789e5); 	|          1.2346e+05|
                                             	
printf("|%.4g|\n",1.234567890123456789e-5);  	|1.235e-05|
printf("|%.4g|\n",1.234567890123456789e5);   	|1.235e+05|
printf("|%.4g|\n",1.234567890123456789e-3);  	|0.001235|
printf("|%.8g|\n",1.234567890123456789e5);   	|123456.79|

Entrées formattées : fscanf

 

Utilisation

La fonction fscanf admet un nombre variable de paramètres. Son utilisation est la suivante :

fscanf ( flot-de-données , format , param1 , param2 , ... , paramn )

Sémantique des paramètres

-
flot-de-données est de type pointeur vers FILE. Il pointe vers le fichier à partir duquel se fait la lecture.
-
format est une chaîne de caractères qui spécifie la forme de l'entrée admissible dans flot-de-données.
-
les parami sont des pointeurs. Ils pointent des variables dans lesquelles fscanf dépose les valeurs lues dans flot-de-données, après les avoir converties en binaire.

Valeur rendue

 Si au moins un parami s'est vu affecter une valeur, fscanf retourne le nombre de parami affectés. Si il y a eu rencontre de fin de fichier ou erreur d'entrée-sortie avant toute affectation à un parami, fscanf retourne EOF.  

Description

fscanf lit une suite de caractères du fichier défini par flot-de-données en vérifiant que cette suite est conforme à la description qui en est faite dans format. Cette vérification s'accompagne d'un effet de bord qui consiste à affecter des valeurs aux variables pointées par les différents parami.  

Quelques définitions

flot d'entrée
il s'agit de la suite de caractères lus du fichier défini par flot-de-données.
caractères blancs
il s'agit des six caractères suivants : espace, tab, line feed, new line, vertical tab et form feed.

modèle
un modèle est la description d'un ensemble de chaînes de caractères. Exemple : %d est le modèle des chaînes formées de chiffres décimaux, éventuellement signées.

conforme
on dira qu'une chaîne est conforme à un modèle quand elle appartient à l'ensemble des chaînes décrites par le modèle. Exemple : 123 est conforme au modèle %d.

directive
une directive peut être :

-
une suite de caractères blancs qui est un modèle d'un nombre quelconque de caractères blancs. Exemple : un espace est un modèle pour un nombre quelconque d'espaces, ou d'un nombre quelconque d'espace et de tab mélangés, ou d'un nombre quelconque d'espaces, de tab et de line-feed mélangés etc.
-
une suite de caractères ordinaires (c'est à dire qui ne sont ni des caractères blancs, ni le caractère %) qui est un modèle pour elle-même. Exemple : la chaîne hello est un modèle de la seule chaîne hello.

-
des séquences d'échappement introduites par le caractère %. Ces séquences jouent un double rôle : elle sont à la fois un modèle des chaînes acceptables dans le flot d'entrée, et elles sont également des ordres de conversion de la chaîne lue et d'affectation du résultat à un une variable pointée par le parami correspondant. Exemple : la directive %d est un modèle des nombres décimaux et ordre de conversion de la chaîne lue en valeur binaire et d'affectation à l'entier pointé par le parami correspondant.

Les séquences d'échappement

                Les séquences d'échappement se composent des éléments suivants :

Algorithme de fscanf

La chaîne format doit se composer d'un ensemble de directives. Il doit y avoir autant de parami que de directives demandant l'affectation d'une valeur. Si il n'y a pas suffisamment de parami pour le format, le comportement n'est pas défini. Si il y a davantage de parami que demandé par le format, les parami en excès sont évalués mais ils sont inutilisés.

La fonction fscanf exécute dans l'ordre chaque directive du format. Si une directive échoue, la fonction fscanf retourne à l'appelant.

-
L'exécution d'une directive formée de caractères blancs, consiste à consommer dans le flot d'entrée la plus longue séquence possible de caractères blancs. Même si cette séquence est de taille nulle, la directive a réussi.
-
L'exécution d'une directive formée de caractères ordinaires, consiste à consommer dans le flot d'entrée une séquence identique à la directive. Au premier caractère différent, la directive a échoué et ce caractère reste non lu.

-
L'exécution d'une directive formée d'une séquence d'échappement, consiste à :

1.
consommer dans le flot d'entrée la plus longue séquence possible de caractères blancs. Cette séquence peut être de taille nulle. Cette action ne s'applique pas aux formats c, n, ni [.

2.
consommer dans le flot d'entrée la plus longue séquence possible de caractères qui soit conforme au modèle. Si cette séquence est de taille nulle, la directive a échoué.

3.
si la directive ne contient pas le caractère *, convertir la chaîne lue et l'affecter à l'objet pointé par le parami correspondant. Si cet objet n'est pas de la taille ou du type convenable pour la recevoir, le comportement n'est pas défini.

Remarques sur la gestion des espaces blancs

La gestion des espaces blancs est assez pénible. Il y a deux méthodes de consommation des espaces blancs du flot de données :
1.
le format contient une directive formée de caractères blancs. Si une telle directive ne peut consommer aucun caractères blancs, c'est un cas d'échec de la directive.
2.
le format contient une séquence d'échappement (autre que c, n, ou [) dont l'exécution commence par consommer d'éventuels caractères blancs dans le flot de données. Si il n'y a pas de caractères blancs à consommer, ce n'est pas une condition d'échec de la directive.

Voyons quelques conséquences.

Si le flot de données contient 23 45 on pourra les lire indifféremment soit :

-
par le format "%d %d" : la première directive %d consomme 23, la directive blanc (entre les deux %d) consomme les blancs entre 2 et 45, et la seconde directive %d essaye de consommer des blancs, échoue (mais ce n'est pas une erreur), puis consomme 45.
-
par le format "%d%d" : la première directive %d consomme 23, la seconde directive %d essaye de consommer des blancs, réussit, puis consomme 45.

Dans les deux cas, les valeurs affectées seront bien les mêmes : 23 et 45.

Un tel phénomène ne se manifeste pas avec les séquences d'échappement dont l'exécution ne commence pas par consommer les espaces blancs. Par exemple, si le flot de données contient 23 jean dupond, on n'obtiendra pas le même résultat selon que l'on utilise le format
"%d %[ abcdefghijklmnopqrstuvwxyz]" ou le format
"%d%[ abcdefghijklmnopqrstuvwxyz]" (sans blanc après %d). Le fscanf réussira dans les deux cas, mais dans le premier cas, la chaîne affectée au parami sera "jean dupond" et dans le second cas, ce sera " jean dupond".

Entrées formattées : scanf

  Nous avons déjà vu scanf, nous allons la définir ici formellement.

Utilisation

La fonction scanf admet un nombre variable de paramètres. Son utilisation est la suivante :

scanf ( format , param1 , param2 , ... , paramn )

Description

Un appel scanf(fmt,...) est rigoureusement identique à fscanf(stdin,fmt,...).

Entrées formattées depuis une chaîne : sscanf

 

Utilisation

La fonction sscanf admet un nombre variable de paramètres. Son utilisation est la suivante :

sscanf ( chaîne , format , param1 , param2 , ... , paramn )

Description

La fonction sscanf réalise le même traitement que la fonction fscanf, avec la différence que les caractères lus par sscanf ne sont pas lus depuis un fichier, mais du tableau de caractères chaîne. La rencontre du nul terminal de chaîne pour sscanf est équivalent à la rencontre de fin de fichier pour fscanf.


next up previous contents index
Suivant: Récréation Début: Les entrées-sorties Précédent: Lecture et écriture par

30/9/1997