28
Introduction Chaˆ ınes de caract` eres Entr´ ees/sorties Exemple UE C avanc´ e cours 5: Chaˆ ınes de caract` eres et entr´ ees/sorties Jean-Lou Desbarbieux et St´ ephane Doncieux UMPC 2009/2010

UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 2: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

Introduction Chaınes de caracteres Entrees/sorties Exemple

Sommaire

1 Introduction

2 Chaınes de caracteres

3 Entrees/sortiesStandard

4 Exemple

Page 3: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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)

Page 4: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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 ? ∗/

Page 5: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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.

Page 6: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 7: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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.

Page 8: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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.

Page 9: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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.

Page 10: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

Introduction Chaınes de caracteres Entrees/sorties Exemple Standard

Entrees/sorties

Page 11: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 12: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 13: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 14: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 15: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 16: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 17: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 18: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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 ;

}

Page 19: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 20: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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.

Page 21: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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 ’ ’ ) ;

}

Page 22: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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.

Page 23: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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

Page 24: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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)

Page 25: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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 ;

}

Page 26: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

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 ;

}

Page 27: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

Introduction Chaınes de caracteres Entrees/sorties Exemple

Exemple

Page 28: UE C avancé cours 5: Chaînes de caractères et entrées/sorties · Les donn ees peuvent ^etre de type quelconque, ptr peut ^etre un pointeur sur un int, un oat, une struct... Il

Introduction Chaınes de caracteres Entrees/sorties Exemple

C’est tout pour aujourd’hui !