ue c avancé cours 5: chaînes de caractères et entrées/sorties · les donn ees peuvent ^etre de...

Post on 25-Dec-2019

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Introduction Chaınes de caracteres Entrees/sorties Exemple

UE C avancecours 5: Chaınes de caracteres et entrees/sorties

Jean-Lou Desbarbieux et Stephane DoncieuxUMPC 2009/2010

Introduction Chaınes de caracteres Entrees/sorties Exemple

Sommaire

1 Introduction

2 Chaınes de caracteres

3 Entrees/sortiesStandard

4 Exemple

Introduction Chaınes de caracteres Entrees/sorties Exemple

Introduction

Beaucoup de fonctions a connaıtre...

retenir dans un premier temps le nom uniquement

faire des fiches ou savoir retrouver rapidement l’informationdans un livre (droit aux documents pendant partiel etexamen !)

sur ordinateur, dans un terminal, taper :man 3 <nom de fonction> (touche ’q’ pour sortir)

Introduction Chaınes de caracteres Entrees/sorties Exemple

Representation en memoire

Dans un tableau, termine par un

’\0’

Exemple :

char nom[]= ” d a v i d ” ;char nom2 [7]= ” g o l i a t h ” ;/∗ i l manque une ca se pour ’\0 ’ ∗/

char nom3 [ ]= ” d a v i d \0 g o l i a t h ” ;p r i n t f ( ”nom2=%s \n” , nom2 ) ; /∗ r e s u l t a t ? ∗/p r i n t f ( ”nom3=%s \n” , nom3 ) ; /∗ r e s u l t a t ? ∗/

Introduction Chaınes de caracteres Entrees/sorties Exemple

Quelques fonctions utiles : strlen

#inc lude < s t r i n g . h>

s i z e t s t r l e n ( const char ∗ s ) ;

Renvoie la longueur d’une chaıne de caracteres.

Introduction Chaınes de caracteres Entrees/sorties Exemple

Quelques fonctions utiles : strcmp

#inc lude < s t r i n g . h>

i n t st rcmp ( const char ∗ s1 , const char ∗ s2 ) ;i n t strncmp ( const char ∗ s1 , const char ∗ s2 ,

s i z e t n ) ;

Comparaison entre chaınes de caracteres.La valeur de retour est :

0 si les deux chaınes sont egales

negative si s1 arrive avant s2

positive sinon

Introduction Chaınes de caracteres Entrees/sorties Exemple

Quelques fonctions utiles : strcpy

#inc lude < s t r i n g . h>

char ∗ s t r c p y ( char ∗ dest , const char ∗ s r c ) ;char ∗ s t r n c p y ( char ∗ dest , const char ∗ s r c ,

s i z e t n ) ;

Copie entre deux chaınes de caracteres.Renvoie un pointeur sur dest.

Introduction Chaınes de caracteres Entrees/sorties Exemple

Quelques fonctions utiles : strdup

#inc lude < s t r i n g . h>

char ∗ s t r d u p ( const char ∗ s1 ) ;

Alloue une nouvelle chaıne de caractere de longueur strlen(s1)+1et l’initialise avec la chaıne s1 (equivalent a malloc+strcpy)ATTENTION : il faut bien penser a liberer par un free la chaınede caracteres ainsi creee.

Introduction Chaınes de caracteres Entrees/sorties Exemple

Quelques fonctions utiles : strcat

#inc lude < s t r i n g . h>

char ∗ s t r c a t ( char ∗ dest , const char ∗ s r c ) ;char ∗ s t r n c a t ( char ∗ dest , const char ∗ s r c ,

s i z e t n ) ;

Ajoute la chaıne de caractere src a la fin de dest.Renvoie un pointeur sur dest.

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Entrees/sorties

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Retour sur printf

Affichage d’un message a l’ecran.

Renvoie un entier : nombre de caracteres ecrits

Message specifie par un format contenant des codes de formatExemples :

double p i =3.141592653589793;p r i n t f ( ”Pi : %f \n” , p i ) ;p r i n t f ( ”Pi avec 2 d e c ima l e s : %.2 f , 4 d e c ima l e s : %.4 f \n”

, p i , p i ) ;p r i n t f ( ”2Pi : %f \n” ,2∗ p i ) ;

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

scanf

Lecture de donnees tapees au clavier

Renvoie un entier : nombre d’entites lues

Exploite egalement un format avec des codes de format

f l o a t x ;i n t n ;s c a n f ( ”%f %d” ,&x ,&n ) ;

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

scanf

ATTENTION : lors de la lecture, seul ce qui est demande est lu !Exemple pathologique :

char c ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;

Que fait le programme ?Lecture d’un seul caractere ! Le 2eme etant le retour a la ligne...Solution ajouter un ’ ’ avant le premier code de format :

s c a n f ( ” %c ” ,&c ) ;

→ l’espace indique que le scanf doit ”consommer” tous lesespaces, retour a la ligne et autre tabulation avant de lire quoi quece soit...

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

scanf

ATTENTION : lors de la lecture, seul ce qui est demande est lu !Exemple pathologique :

char c ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;s c a n f ( ”%c ” ,&c ) ;p r i n t f ( ” Char l u : %c\n” , c ) ;

Que fait le programme ?Lecture d’un seul caractere ! Le 2eme etant le retour a la ligne...Solution ajouter un ’ ’ avant le premier code de format :

s c a n f ( ” %c ” ,&c ) ;

→ l’espace indique que le scanf doit ”consommer” tous lesespaces, retour a la ligne et autre tabulation avant de lire quoi quece soit...

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Quelques codes de format courants

%d : entier

%u : entier non signe

%f : flottant

%c : caractere

%s : chaıne de caracteres (ATTENTION...)

%p : pointeur

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

getchar/putchar

int getchar() : lecture d’un caractere. Renvoie le code ducaractere lu, EOF si probleme. Equivalent ascanf("%c",&c lu)

int putchar(int c) : ecriture d’un caractere. Renvoie lecode du caractere ecrit, EOF si probleme. Equivalent aprintf("%c",c a ecrire)

Fonctions plus simples et plus rapides

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

getchar

ATTENTION : meme probleme sur le getchar que sur scanfExemple de solution :

i n t c ;do

c=g e t c h a r ( ) ;whi le ( c==’ \n ’ ) ;

ou pour eviter aussi espaces, retours a la ligne et autrestabulations :

#inc lude <c t y p e . h>

i n t c ;do

c=g e t c h a r ( ) ;whi le ( i s s p a c e ( c ) ) ;

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Fichiers : principes

Fichiers manipules au travers d’une structure (FILE)

Cette structure est initialisee par une fonction d’ouverture defichier, et est detruite par une fonction de fermeture de fichier

Exemple :

#i n c l u d e <s t d i o . h>i n t main ( ) {

FILE ∗mon f i c h i e r ;i n t x , y , z ;i f ( ( mon f i c h i e r= fopen ( ” f i c h i e r . t x t ” , ” r ”))==NULL) {

p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de f i c h i e r . t x t \n” ) ;r e t u r n 1 ;

}f s c a n f ( mon f i c h i e r , ”%d %d %d” ,&x ,&y ,&z ) ;p r i n t f ( ” Va l e u r s l u e s : %d %d %d\n” , x , y , z ) ;f c l o s e ( mon f i c h i e r ) ;r e t u r n 0 ;

}

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Ouverture d’un fichier : fopen/fclose

FILE *fopen(const char *nom fichier, const char*mode) : ouvre le fichier selon le mode indique (“r”, “w”,“a”,...)

int fclose(FILE *flux) : vide eventuellement le tamponde lecture/ecriture, libere la memoire correspondante et fermele fichier

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

La lecture binaire

s i z e t f r e a d ( v o i d ∗ ptr , s i z e t s i z e ,s i z e t nmemb , FILE ∗ s t ream ) ;

La fonction fread lit nmemb elements de donnees, chacun d’euxrepresentant size octets de long, depuis le flux pointe par stream,et les stocke a l’emplacement pointe par ptr.

Les donnees peuvent etre de type quelconque, ptr peut etre unpointeur sur un int, un float, une struct... Il peut etre un tableaude donnees d’un type quelconque.

ATTENTION : il n’y a aucune espece de format, les donneesecrites dans le fichier sont recopiees directement en memoire.

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

La lecture binaire

s t r u c t po i n t {i n t x ;i n t y ;} ;

. . .

FILE ∗ f i c h i e r ;/∗ ou v e r t u r e du f i c h i e r ∗/i f ( ( f i c h i e r=fopen ( nom f i c h i e r , ” rb ”))==NULL) {

p r i n t f ( ” E r r e u r l o r s de l a l e c t u r e de %s \n” , n om f i c h i e r ) ;e x i t ( 1 ) ;

}s t r u c t po i n t p o i n t l u ;

i n t nb l u=f r e a d (& po i n t l u , s i z e o f ( s t r u c t po i n t ) , 1 , f i c h i e r ) ;

i f ( nb l u == 1) {p r i n t f ( ‘ ‘ L e c t u r e OK\n ’ ’ ) ;

}e l s e {

p r i n t f ( ‘ ‘ L e c t u r e KO\n ’ ’ ) ;

}

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

L’ecriture binaire

s i z e t f w r i t e ( const v o i d ∗ ptr , s i z e t s i z e ,s i z e t nmemb , FILE ∗ s t ream ) ;

La fonction fwrite ecrit nmemb elements de donnees, chacund’eux representant size octets de long, dans le flux pointe parstream, apres les avoir lus depuis l’emplacement pointe par ptr.

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

L’ecriture binaire

s t r u c t po i n t tab [ 1 0 ] ;

/∗ I n i t i a l i s a t i o n de tab ∗/. . .

/∗ ou v e r t u r e du f i c h i e r ∗/i f ( ( f i c h i e r=fopen ( nom f i c h i e r , ”wb”))==NULL) {

p r i n t f ( ” E r r e u r l o r s de l ’ e c r i t u r e de %s \n” , n om f i c h i e r ) ;e x i t ( 1 ) ;

}

f w r i t e ( tab , s i z e o f ( s t r u c t po i n t ) , 10 , f i c h i e r ) ;

/∗ f e rme tu r e du f i c h i e r ∗/f c l o s e ( f i c h i e r ) ;

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Lecture/ecriture formatee

int fscanf(FILE *flux,const char *format, ...) :lecture de donnees a partir d’un format depuis un fichier

int fprintf(FILE *flux, const char *format,...) :ecriture de donnees selon un format specifie dans un fichier

int fputc(int c, FILE *flux) : ecrit un caractere dansun fichier

int fgetc(FILE *flux) : lit un caractere depuis un fichier

char * fgets(char *buffer, int n, FILE *flux) : litune ligne dans un fichier (longueur maximale=n)

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Exemple

#i n c l u d e <s t d i o . h>

i n t main ( ) {

FILE ∗ s r c , ∗ de s t ;i n t ca r ;i f ( ( s r c= fopen ( ” sou r c e . t x t ” , ” r ”))==NULL) {

p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de s ou r c e . t x t \n” ) ;r e t u r n 1 ;

}i f ( ( d e s t= fopen ( ” d e s t i n a t i o n . t x t ” , ”w”))==NULL) {

p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de d e s t i n a t i o n . t x t \n” ) ;r e t u r n 1 ;

}ca r = f g e t c ( s r c ) ;w h i l e ( ca r !=EOF) {

f p u t c ( car , d e s t ) ;c a r = f g e t c ( s r c ) ;

}f c l o s e ( s r c ) ;f c l o s e ( d e s t ) ;r e t u r n 0 ;

}

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Lecture d’un fichier ligne a ligne

Lecture d’un fichier contenant 3 entiers par ligne avec fgets etsscanf

#i n c l u d e <s t d i o . h>#d e f i n e LONGUEURLIGNE 128

i n t main ( ) {FILE ∗ s r c ;i f ( ( s r c= fopen ( ” sou r c e . t x t ” , ” r ”))==NULL) {

p r i n t f ( ” E r r e u r a l ’ o u v e r t u r e de s ou r c e . t x t \n” ) ;r e t u r n 1 ;

}char b u f f e r [ LONGUEURLIGNE ] ;char ∗ r e s=f g e t s ( b u f f e r , LONGUEURLIGNE, s r c ) ;i n t a , b , c ;w h i l e ( r e s != NULL) {

s s c a n f ( b u f f e r , ” %d %d %d” ,&a , &b , &c ) ;r e s=f g e t s ( b u f f e r , LONGUEURLIGNE, s r c ) ;p r i n t f ( ”Lu l e s e n t i e r s a=%d , b=%d , c=%d\n” , a , b , c ) ;

}

f c l o s e ( s r c ) ;r e t u r n 0 ;

}

Introduction Chaınes de caracteres Entrees/sorties Exemple

Exemple

Introduction Chaınes de caracteres Entrees/sorties Exemple

C’est tout pour aujourd’hui !

top related