ue c avancé cours 5: chaînes de caractères et entrées/sorties · les donn ees peuvent ^etre de...
TRANSCRIPT
![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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/1.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022041505/5e24d1d94a8c837193362f1e/html5/thumbnails/28.jpg)
Introduction Chaınes de caracteres Entrees/sorties Exemple
C’est tout pour aujourd’hui !