• Aucun résultat trouvé

IN3R11-2 – C Cours 4 Damien MASSON

N/A
N/A
Protected

Academic year: 2022

Partager "IN3R11-2 – C Cours 4 Damien MASSON"

Copied!
21
0
0

Texte intégral

(1)

IN3R11-2 – C

Cours 4

Damien MASSON [email protected]

http://esiee.fr/~massond/Teaching/IN3R11-2/

22 novembre 2010

(2)

printf

renvoit le nombre de caract`eres affich´es retour n´egatif en cas d’erreur

tr`es rare : sortie redirig´ee vers un fichier et plus de place sur le disque

les autres cas d’erreur (droits, disque amovibles d´ebranch´e...) sont g´er´es par le syst`eme

(3)

Affichage des entiers

%d : entier sign´e

%u : entier non sign´e

%o : entier non sign´e en octal

%x %X : entier non sign´e en hexad´ecimal

i n t main (i n t a r g c ,c h a r a r g v [ ] ){ i n t i =−45, j =43;

p r i n t f (" % d \ n ", i ) ; /∗ −45 ∗/

p r i n t f (" % u \ n ", i ) ; / 4 2 9 4 9 6 7 2 5 1 ∗/

p r i n t f (" % o \ n ", j ) ; / 53 ∗/

p r i n t f (" % x \ n ", j ) ; / 2 b ∗/

p r i n t f (" % X \ n ", j ) ; / 2B ∗/

r e t u r n 0 ; }

(4)

Affichage des r´ eels

%f : standard, 6 d´ecimales

%g : standard, sans les z´eros finaux

%e %E : notation exponentielle

i n t main (i n t a r g c ,c h a r a r g v [ ] ) { d o u b l e f = 3 4 5 . 5 7 5 ;

p r i n t f (" % f \ n ", f ) ; / 3 4 5 . 5 7 5 0 0 0 ∗/

p r i n t f (" % g \ n ", f ) ; / 3 4 5 . 5 7 5 ∗/

p r i n t f (" % e \ n ", f ) ; / 3 . 4 5 5 7 5 0 e +002 ∗/

p r i n t f (" % E \ n ", f ) ; / 3 . 4 5 5 7 5 0 E+002 ∗/

r e t u r n 0 ; }

(5)

Formats sp´ eciaux

%p : affichage en hexad´ecimal des adresses m´emoires

%n : stocke le nombre de caract`eres d´ej`a ´ecrits

i n t main (i n t a r g c ,c h a r a r g v [ ] ) { i n t n ;

d o u b l e d = 4 5 8 . 2 1 ;

p r i n t f (" % g % n ", d ,& n ) ; /∗ 458.21=6 c h a r s ∗/

p r i n t f (" =% d c h a r s \ n ", n ) ; /∗ &n=0022FF6C ∗/

p r i n t f (" & n =% p \ n ",&n ) ; r e t u r n 0 ;

}

(6)

le Gabarit

entier apr`es le % = nombre minimum de caract`eres `a utiliser compl`ete avec des espaces si n´ecessaire, ou des z´eros si %0 avant un nombre gabarit != pr´ecision ! !

i n t main (i n t a r g c ,c h a r a r g v [ ] ) {

p r i n t f (" %5 d \ n ", 4 ) ; /∗ 4 / p r i n t f (" %5 d \ n ", 1 2 3 4 5 6 ) ; /∗ 1 2 3 4 5 6 / p r i n t f (" %5 f \ n ", 3 . 1 f ) ; /∗ 3 . 1 0 0 0 0 0 / p r i n t f (" %5 s \ n "," abc ") ; /∗ a b c / p r i n t f (" %05 d \ n ", 4 ) ; /∗ 00 0 04 / r e t u r n 0 ;

}

(7)

Pr´ ecision

%.3f : 3 d´ecimales r`egle d’arrondi

compatible avec un gabarit

i n t main (i n t a r g c ,c h a r a r g v [ ] ) { d o u b l e f = 3 . 1 4 1 5 9 2 6 5 ;

p r i n t f (" %.3 f \ n ", f ) ; /∗ 3 . 1 4 2 ∗/

p r i n t f (" % 0 8 . 3 f \ n ", f ) ; /∗ 0 0 0 3 . 1 4 2 ∗/

p r i n t f (" %.4 e \ n ", f ) ; /∗ 3 . 1 4 1 6 e +000 ∗/

r e t u r n 0 ; }

(8)

Gabarit et pr´ ecision variables

si on ne les connaˆıt pas `a la compilation : * au lieu d’un entier + variable en argument de printf

i n t main (i n t a r g c ,c h a r a r g v [ ] ) { i n t i , tmp ;

i n t max=0;

f o r ( i =0; i<a r g c ; i ++) { tmp= s t r l e n ( a r g v [ i ] ) ; i f ( tmp>max ) max=tmp ; }

f o r ( i =0; i<a r g c ; i ++) {

p r i n t f (" arg #% d =%* s \ n ", i , max , a r g v [ i ] ) ; }

r e t u r n 0 ; }

/

a r g #0= . / t a r g #1= i s a r g #2= t h e a r g #3=command

/

(9)

Signes des nombres

%+d : force l’affichage du signe

% d : met un espace si le signe est un +

i n t main (i n t a r g c ,c h a r a r g v [ ] ) { f l o a t f =12.54 f ;

f l o a t g =−12.54 f ; p r i n t f (" %+ f \ n ", f ) ; p r i n t f (" %+ f \ n ", g ) ; p r i n t f (" % f \ n ", f ) ; p r i n t f (" % f \ n ", g ) ; p r i n t f (" % + . 3 f \ n ", f ) ; r e t u r n 0 ;

} /

+ 1 2 . 5 4 0 0 0 0

−12.540000 1 2 . 5 4 0 0 0 0

−12.540000 +12.540

/

(10)

sprintf

Idem que printf mais ´ecrit dans une chaˆıne de caract`eres suppos´ee assez longue.Attention aux d´ebordements

i n t main (i n t a r g c ,c h a r a r g v [ ] ) { c h a r f i r s t n a m e=" J o h n ";

c h a r l a s t n a m e=" Doe "; c h a r e m a i l [ 2 5 6 ] ;

s p r i n t f ( e m a i l ," % s .% s @ e s i e e . fr ", f i r s t n a m e , l a s t n a m e ) ; p r i n t f (" e m a i l =% s \ n ", e m a i l ) ;

r e t u r n 0 ; }

(11)

scanf

%∗[cd...] : saisir sans sauver le r´esultat dans une variable :

i n t s c a n p o s i t i v e i n t e g e r ( ) { i n t r e s , n=−1;

do {

r e s=s c a n f (" % d ",&n ) ; i f ( r e s ==−1) r e t u r n −1;

i f ( r e s ==0) {

s c a n f (" %* c ") ; /∗ i c i ∗/

}

} w h i l e ( n<0) ; r e t u r n n ; }

(12)

sscanf

Permet de lire dans une chaˆıne de caract`ere

i n t main (i n t a r g c ,c h a r a r g v [ ] ) {

c h a r d a t e=" Tue Jul 17 1 4 : 5 0 : 0 0 C E S T 2 0 0 7 "; c h a r d a y [ 4 ] , month [ 4 ] ;

i n t nday , y e a r ;

s s c a n f ( d a t e ," % s % s % d %* s %* s % d ", day , month ,& nday ,& y e a r ) ;

p r i n t f (" % s % d % s % d \ n ", day , nday , month , y e a r ) ; r e t u r n 0 ;

}

(13)

Autres entr´ ees/sorties bufferis´ ees

Entr´ees sorties bufferis´ees sans formats : getchar : lit un char

putchar : ´ecrit un char

gets : lit une chaˆıne de caract`eres puts : ´ecrit une chaˆıne de caract`eres

(14)

Entr´ ees/sorties non buffereis´ ees

Appels syst`emes : read/write (voir fichiers)

(15)

Fichiers

espace de stockage de donn´ees

op´erations permises : lire, ´ecrire, tronquer

il n’est pas pr´evu de m´ecanisme pour enlever un morceau au milieu d’un fichier

tous les fichiers ne sont pas en random access (ex : /dev/mouse)

(16)

primitives

primitives syst`emes :

i n t o p e n (c o n s t c h a r pathname ,i n t f l a g s , m o d e t mode ) ; i n t c l o s e (i n t f d ) ;

s s i z e t r e a d (i n t f d ,v o i d b u f , s i z e t c o u n t ) ;

s s i z e t w r i t e (i n t f d ,c o n s t v o i d b u f , s i z e t c o u n t ) ;

peu pratiques car ne manipulent que des octets

(17)

structure FILE

FILE = structure d´ecrivant un fichier

varie selon les impl´ementations ne jamais utiliser ses champs directement

fonctions de stdio.h :

FILE f o p e n (c o n s t c h a r p a t h ,c o n s t c h a r mode ) ; i n t f c l o s e ( FILE s t r e a m ) ;

s i z e t f r e a d (v o i d p t r , s i z e t s i z e , s i z e t n , FILE s t r e a m ) ; s i z e t f w r i t e (c o n s t v o i d p t r , s i z e t s i z e , s i z e t n , FILE

s t r e a m ) ;

i n t f s c a n f ( FILE∗ s t r e a m ,c o n s t c h a r f o r m a t , . . . ) ; i n t f p r i n t f ( FILE∗ s t r e a m ,c o n s t c h a r f o r m a t , . . . ) ;

(18)

Ouvrir un fichier

options de fopen :

”r” : lecture seule

”w” : ´ecriture ´ecriture seule (fichier cr´e si n´ecessaire, ´ecras´e si existant)

”a” : ajout en fin (fichier cr´e si n´ecessaire) toujours tester la valeur de retour

par d´efaut, en mode texte, pour op´eration en mode binaire :

”rb” ”wb” ”ab”

en mode lecture et ´ecriture : ”r+” ”w+” ”a+”

(19)

Fermer un fichier

fclose(f) ;

f doit ˆetre non NULL

f doit repr´esenter une adresse valide obtenue avec fopen f ne doit pas avoir d´ej`a ´et´e ferm´e

tout fichier ouvert doit ˆetre ferm´e ! ! (fuite m´emoire)

(20)

entr´ es/sorties format´ ees

fprintf, fscanf : fonctionnent comme printf et scanf printf = fprintf(stdout...

scanf = fscanf(stdin...

stdin, stdout, stderr dont des FILE*

fgetc, fputc fonctionnent comme getchar putchar fgets, fputs fonctionnent comme gets puts

toujours lire le man de ces fonctions avant de les utiliser (pour ˆ

etre sur de ce qu’elles font et ne font pas)

(21)

Fin de fichier en lecture

fscanf : EOF fgetc : EOF fgets : NULL fread : 0

v o i d c o p y ( FILE s r c , FILE d s t ) { c h a r b u f f e r [ 4 0 9 6 ] ;

s i z e t n ;

w h i l e ( ( n=f r e a d ( b u f f e r ,s i z e o f(c h a r) , 4 0 9 6 , s r c ) )>0) { f w r i t e ( b u f f e r ,s i z e o f(c h a r) , n , d s t ) ;

} }

Références

Documents relatifs

I Fonctions d’Entr ´ees/Sorties du langage C pour modifier des caract `eres sur le pointeur et d ´eplacer ce pointeur dans le fichier ouvert.. I Fermeture

´ Ecrire une fonction majuscules qui prend en entr´ee un tableau de caract`eres rempli avec une chaˆıne de caract`eres et qui modifie ce tableau pour remplacer tous les caract`eres

Comme le premier vecteur est orient´ e suivant l’axe Ox, il y a toujours au moins une extr´ emit´ e ` a l’int´ erieur du carr´ e.. L’image de droite illustre l’un des 2

Syntaxe de l’adressage indirect par registre en langage symbolique.- Comme nous l’avons d´ej` a vu, en langage symbolique, pour d´esigner une constante on ´ecrit celle-ci

imprime toutes les lignes contenant le mot analyse suivi du mot lexical dans tous les fichiers de suffixe .tex. (L’option -i

Que valent les sorties S et T en fonction des entr´ees A, B,

Exercice 6 Ecrire un programme qui permet de saisir l’ˆ age de 5 personnes puis qui affiche true si au moins 4 personnes sont adultes (ˆ age&gt;18) et false sinon (ne pas utiliser

Exercice 4 : cryptage Ecrire un programme qui demande ` a l’utilisateur de saisir 26 lettres pour chiffrer les 26 lettres de l’alphabet (et v´ erifie qu’il ne rentre pas deux fois