• Aucun résultat trouvé

5.5 E/S formattees sur chiers

5.5.5 Entrees formattees : fscanf

Utilisation

La fonction fscanf admet un nombre variable de parametres. Son utilisation est la suivante:

fscanf ( ot-de-donnees, format,param1 ,param2 ,...,paramn )

Semantique des parametres

{ ot-de-donneesest de type pointeur versFILE. Il pointe vers le chier a partir duquel se fait la lecture.

{ format est une cha^ne de caracteres qui speci e la forme de l'entree admissible dans ot-de-donnees.

{ les paramisont des pointeurs. Ils pointent des variables dans lesquellesfscanfdepose les valeurs lues dans ot-de-donnees, apres les avoir converties en binaire.

Valeur rendue

Si au moins un parami s'est vu a ecter une valeur, fscanf retourne le nombre de parami a ectes. Si il y a eu rencontre de n de chier ou erreur d'entree-sortie avant toute

a ectation a un parami,fscanfretourne EOF.

Description

fscanflit une suite de caracteres du chier de ni par ot-de-donnees en veri ant que cette suite est conforme a la description qui en est faite dans format. Cette veri cation s'accompagne d'un e et de bord qui consiste a a ecter des valeurs aux variables pointees par les di erents parami.

Quelques de nitions

ot d'entree

il s'agit de la suite de caracteres lus du chier de ni par ot-de-donnees.

caracteres blancs

il s'agit des six caracteres suivants: espace, tab, line feed, new line, vertical tab et form feed.

modele

un modele est la description d'un ensemble de cha^nes de caracteres. Exemple: %d est le modele des cha^nes formees de chi res decimaux, eventuellement signees.

conforme

on dira qu'une cha^ne est conforme a un modele quand elle appartient a l'en- semble des cha^nes decrites par le modele. Exemple: 123 est conforme au modele %d.

directive

une directive peut ^etre :

{ une suite de caracteres blancs qui est un modele d'un nombre quelconque de caracteres blancs. Exemple: un espace est un modele pour un nombre quel- conque d'espaces, ou d'un nombre quelconque d'espace et de tab melanges, ou d'un nombre quelconque d'espaces, de tab et de line-feed melanges etc.

{ une suite de caracteres ordinaires (c'est a dire qui ne sont ni des caracteres blancs, ni le caractere%) qui est un modele pour elle-m^eme. Exemple: la cha^ne hello est un modele de la seule cha^ne hello.

{ des sequences d'echappement introduites par le caractere %. Ces sequences jouent un double r^ole: elle sont a la fois un modele des cha^nes acceptables dans le ot d'entree, et elles sont egalement des ordres de conversion de la cha^ne lue et d'a ectation du resultat a une variable pointee par le parami correspondant.

Exemple: la directive %d est un modele des nombres decimaux et un ordre de conversion de la cha^ne lue en valeur binaire et d'a ectation a l'entier pointe par le parami correspondant.

Les sequences d'echappement

Les sequences d'echappement se composent des elements suivants:

1 le caractere*(optionnel) qui indique que la directive doit ^etre consideree comme un pur modele: pas de conversion de la cha^ne lue, et pas d'a ectation a un parami.

2 un nombre (optionnel) qui indique la longueur maximum de la cha^ne acceptable du ot d'entree.

3 un caractere optionnel, qui est un modi cateur de type, pouvant prendre l'une des valeurs suivantes:

h s'appliquant aux formats d, i, n: parami sera interprete comme un pointeur vers unshort int.

h s'appliquant aux formats o, u, x: parami sera interprete comme un pointeur vers ununsigned short int.

l s'appliquant aux formats d, i, n: parami sera interprete comme un pointeur vers unlong int.

l s'appliquant aux formats o, u, x: parami sera interprete comme un pointeur vers ununsigned long int.

l s'appliquant aux formats e, f, g: parami sera interprete comme un pointeur vers undouble.

L s'appliquant aux formats e, f, g: parami sera interprete comme un pointeur vers unlong double.

4 un caractere de conversion qui peut prendre l'une des valeurs suivantes:

d modele pour un nombre decimal eventuellement precede d'un signe. Le parami correspondant est interprete comme un pointeur vers un

int, sauf si la directive contient un modi cateur de type.

i modele pour un nombre eventuellement precede d'un signe, et ayant l'une des trois formes suivantes:

{ un nombre decimal.

{ un nombre debutant par0qui sera pris comme nombre octal.

{ un nombre debutant par0x ou 0X, qui sera pris comme nombre hexadecimal.

Le parami correspondant est interprete comme un pointeur vers un

int, sauf si la directive contient un modi cateur de type.

o modele pour un nombre octal eventuellement precede d'un signe. Le parami correspondant est interprete comme un pointeur vers un

unsigned int, sauf si la directive contient un modi cateur de type. u modele pour un nombre decimal eventuellement precede d'un signe.4

Le parami correspondant est interprete comme un pointeur vers un

unsigned int, sauf si la directive contient un modi cateur de type.

4. Non, il n'y a pas d'erreur: bien que ce format soit pour desunsigned, dans le ot d'entree, le nombre

x modele pour un nombre hexadecimal eventuellement precede d'un signe. Le parami correspondant est interprete comme un pointeur

vers un unsigned int, sauf si la directive contient un modi cateur de type.

Remarque

En ce qui concerne les formatso,u, etx, le lecteur a sans doute

ete surpris de voir que le parami correspondant est interprete

comme un pointeur vers ununsigned intalors que la cha^ne

dans le ot d'entree qui correspond a ces formats est un nombre eventuellement precede d'un signe. Il n'y a pas d'erreur, c'est bien ce que dit la norme.

c modele pour une suite de caracteres dont le nombre est donne par le nombre (optionnel) qui indique la longueur maximum de la cha^ne acceptable du ot d'entree (Cf plus haut). Si ce nombre optionnel ne gure pas dans la directive, il est pris egal a 1. Le parami corres-

pondant est interprete comme etant un pointeur vers un tableau de caracteres susamment grand pour contenir la cha^ne lue. Il n'y a pas de null rajoute a la n de la cha^ne lue dans le ot d'entree. s modele pour une suite de caracteres non blancs. Le parami correspon-

dant est interprete comme un pointeur vers un tableau de caracteres susamment grand pour contenir la cha^ne lue plus un null terminal. e,f,g modele pour un ottant ecrit selon la syntaxe d'une constante ot- tante du langage C. Le parami correspondant est interprete comme un

pointeur vers unfloat , sauf si la directive contient un modi cateur de type.

[ Dans la cha^ne format, ce caractere introduit une sequence particu- liere destinee a de nir un scanset. La sequence est formee du caractere [, suivi d'une suite de caracteres quelconques, suivi du caractere]. Si le premier caractere apres le crochet ouvrant n'est pas le caractere ^, le scanset est l'ensemble des caracteres entre crochets. Si le caractere apres le crochet ouvrant est le caractere ^, le scanset est l'ensemble des caracteres

ne

se trouvant

pas

dans la cha^ne entre crochets. Le scanset peut comprendre le caractere ] a condition de le mettre en debut soit [] ...] ou [^]...] selon que l'on utilise la forme sans ou avec ^. Le scanset peut contenir^a condition de ne pas le mettre en t^ete : [...^...].

Une directive [ est un modele pour une suite de caracteres appar- tenant au scanset. Le parami correspondant est interprete comme

un pointeur vers un tableau de caracteres susamment grand pour contenir la cha^ne lue plus un null terminal.

p modele pour un pointeur ecrit d'une maniere dependant de l'imple- mentation, mais identique a l'impression par printf d'un pointeur selon le format %p. Le parami correspondant est interprete comme un pointeur vers un pointeur versvoid.

n cette directive n'est pas un modele. Elle ne sert qu'a mettre une valeur dans l'objet pointe par le parami correspondant. Le parami

correspondant est interprete comme un pointeur vers un int dans lequel fscanfecrit le nombre de caracteres lus jusqu'a ce moment, dans le ot de donnees, par cette invocation de fscanf. L'execution d'une directive %n n'augmente pas le nombre des parami a ectes qui sera retourne par fscanf(Cf 5.5.5).

% est un modele pour le caractere %. La directive complete est %%.

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'a ectation d'une valeur. Si il n'y a pas susamment

de parami pour le format, le comportement n'est pas de ni. Si il y a davantage de parami

que demande par le format, les parami en exces sont evalues mais ils sont inutilises.

La fonction fscanf execute dans l'ordre chaque directive du format. Si une directive echoue, la fonction fscanfretourne a l'appelant.

{ L'execution d'une directive formee de caracteres blancs, consiste a consommer dans le ot d'entree la plus longue sequence possible de caracteres blancs. M^eme si cette sequence est de taille nulle, la directive a reussi.

{ L'execution d'une directive formee de caracteres ordinaires, consiste a consommer dans le ot d'entree une sequence identique a la directive. Au premier caractere di erent, la directive a echoue et ce caractere reste non lu.

{ L'execution d'une directive formee d'une sequence d'echappement, consiste a: 1. consommer dans le ot d'entree la plus longue sequence possible de caracteres

blancs. Cette sequence peut ^etre de taille nulle. Cette action ne s'applique pas aux formatsc,n, ni[.

2. consommer dans le ot d'entree la plus longue sequence possible de caracteres qui soit conforme au modele. Si cette sequence est de taille nulle, la directive a echoue.

3. si la directive ne contient pas le caractere *, convertir la cha^ne lue et l'a ecter a l'objet pointe 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 de ni.

Remarques sur la gestion des

espaces blancs

La gestion des espaces blancs est assez penible. Il y a deux methodes de consommation des espaces blancs du ot de donnees:

1. le format contient une directive formee de caracteres blancs. Si une telle directive ne peut consommer aucun caractere blanc, c'est un cas d'echec de la directive.

2. le format contient une sequence d'echappement (autre quec,n, ou[) dont l'execution commence par consommer d'eventuels caracteres blancs dans le ot de donnees. Si il n'y a pas de caracteres blancs a consommer, ce n'est pas une condition d'echec de la directive.

Voyons quelques consequences.

Si le ot de donnees contient 23 45on pourra les lire indi eremment soit:

{ par le format "%d %d": la premiere directive %d consomme 23, la directive blanc (entre les deux%d) consomme les blancs entre2et45, et la seconde directive%dessaye de consommer des blancs, echoue (mais ce n'est pas une erreur), puis consomme 45.

{ par le format "%d%d": la premiere directive %d consomme 23, la seconde directive %d essaye de consommer des blancs, reussit, puis consomme 45.

Dans les deux cas, les valeurs a ectees seront bien les m^emes: 23 et 45.

Un tel phenomene ne se manifeste pas avec les sequences d'echappement dont l'execu- tion ne commence pas par consommer les espaces blancs. Par exemple, si le ot de donnees contient 23 jean dupond, on n'obtiendra pas le m^eme resultat selon que l'on utilise le format

"%d %[ abcdefghijklmnopqrstuvwxyz]"ou le format

"%d%[ abcdefghijklmnopqrstuvwxyz]" (sans blanc apres %d). Le fscanf reussira dans les deux cas, mais dans le premier cas, la cha^ne a ectee au parami sera "jean dupond" et dans le second cas, ce sera " jean dupond".

Documents relatifs