Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
5.1 Introduction
Le caractère est considéré comme la donnée la plus élémentaire en programmation procé-
durale, (bien qu'il soit possible de manipuler directement des bits de donnée). La raison
est que, en terme de mémoire, un caractère peut être codé sur un seul octet, ce qui corres-
pond à la plus petite unité de mémoire adressable. Le langage C compte, parmi ses types
de base, le type char, qui sert à implémenter des caractères sur machine.
Il est, par ailleurs, possible d'agencer un ensemble de caractères pour obtenir l'une des
structures de données les plus usitées en programmation procédurale, à savoir, la chaîne
de caractères. Bien que le langage C n'ore pas un type particulier pour implémenter des
chaînes de caractères, ces dernières sont implémentée à l'aide de tableaux unidimensionnels
de caractères.
Par ailleurs, des chaînes de caractères plus ou moins longues peuvent être sauvegardées
dans des mémoires secondaires, sous la forme de chiers de caractères, plus connus sous
l'appellation de chiers texte. Le langage C met à la disposition du programmeur un
ensemble d'outils permettant de créer et de manipuler de tels chiers, avec la possibilité
de les formater selon le besoin.
Rappelons, enn, que le format d'impression pour les caractères est %c.
1
2 CHAPITRE 5. CHAÎNE & FICHIER DE CARACTÈRES
char chaine[MAX_CHAINE+1];
où MAX_CHAINE est supposée être une constante déjà dénie. Il est aussi possible de déclarer
un pointeur sur caractère, puis de l'initialiser par l'adresse d'une zone mémoire allouée
dynamiquement qui a la taille désirée :
où n est une variable entière contenant le nombre de caractères dédiés à la variable chaîne
proprement dite. Notez que, dans les deux déclarations précédentes, une case supplémen-
taire a été prévue an de mémoriser le caractère de n de chaîne '\0' dont le code ASCII
est 0. Ce dernier est un caractère spécial qui est ajouté à la n de chaque chaîne pour
indiquer la n de celle-ci.
Une fois déclarée, une variable chaîne de caractères peut être manipulée comme un
tableau unidimensionnel de caractères, avec la particularité de se terminer toujours par
le caractère de n de chaîne '\0'. Ainsi, l'accès aux diérents caractères de la chaîne peut
se faire à l'aide des crochets est d'un indice entier, comme dans l'exemple suivant :
Une chaîne de caractère peut, toutefois, être initialisée autrement, par exemple comme
suit :
char mess[] = "Hello ENIT !", *voyel = "aeiouy", secret[] =
{69,78,73,84,0};
Dans la déclaration précédente, la variable secret a été initialisée en utilisant les codes
ASCII des caractères E, N, I, et T.
5.3. LES CHAÎNES DE CARACTÈRES 3
Figure 5.1 Table des codes ASCII des caractères usuels sous Linux.
4 CHAPITRE 5. CHAÎNE & FICHIER DE CARACTÈRES
1 void ManipChaine1 ( )
2 {
3 int i ;
4 char a l p h a b e t [ 2 7 ] ;
5
8 alphabet [ 2 6 ] = '\0' ;
9
10 printf ( "%s\n" , a l p h a b e t ) ;
11
12 char ∗ p t r = alphabet ;
13 while ( ∗ p t r )
14 {
16 p t r ++;
17 }
18 printf ( "\n%s\n" , a l p h a b e t ) ;
19 }
Les fonctions C qui se trouvent dans la Figure 5.3 illustrons quelques utilisations
possibles des fonctions prédénies manipulant les chaînes de caractères.
où ot est une variable pointeur sur la structure FILE. Lors de l'ouverture d'un chier, il
est nécessaire de préciser deux paramètres :
Le nom du chier physique, qui est une chaîne de caractère pouvant éventuelle-
ment contenir le chemin d'accès au chier. La fonction fopen() associera alors le
ot pointé par la variable ot au chier physique dont le nom se trouve dans le
paramètre nomFichier.
Le mode d'accès au chier. Il existe plusieurs modes d'accès possibles qui dépendent
principalement du fait que l'on veut créer un nouveau chier ou que l'on veut ou-
vrir un qui existe déjà. Le Tableau 5.1 résume ces diérents modes d'accès ainsi
que l'eet de chaque mode sur le chier ouvert. La colonne position du Tableau 5.1
indique la position, dans le chier, où la lecture/écriture va avoir lieu. L'indicateur
initialisation veut dire que le chier va être initialisé, ce qui se traduit par la perte
du contenu du chier dans le cas où ce dernier existe déjà. Enn, signalons que les
deux cas qui aboutissent à une erreur, et qui correspondent aux cas où l'on cherche
6 CHAPITRE 5. CHAÎNE & FICHIER DE CARACTÈRES
1 void ManipChaine2 ( )
2 {
3 int i ;
4 char c h a i n e [ 6 4 ] , c o d e [ 6 4 ] ;
5 char m e s s [ ] = "Hello ENIT !" , secret [ ] = {69 , 78 , 73 , 84 , 0};
11 strcpy ( chaine , s e c r e t ) ;
12 printf ( "%s\n" , c h a i n e ) ;
13
21 / / R e c h e r c h e d ' un c a r a c t è r e ou s o u s − c h a i n e d a n s u n e c h a i n e
23 }
24 // Fonction calculant le nombre d ' occurrence d ' une sous −c h a i n e dans une
chaine
27 int nbOccur = 0;
28
29 while ( ( c h a i n e= s t r s t r ( c h a i n e , sousChaine ) ) )
30 {
31 n b O c c u r++;
32 c h a i n e ++;
33 }
34
35 return nbOccur ;
Figure 5.3 Utilisation des fonctions prédénies pour la manipulation des chaînes de
caractères. Fonction comptant le nombre d'occurrence d'une sous-chaîne dans une chaîne
de caractère.
5.4. LES FICHIERS DE CARACTÈRES 7
Table 5.1 Modes d'accès à un chier texte. Les caractères r et w désignent la possibilité
de lecture est l'écriture respectivement. Le caractère + indique qu'il est possible de lire et
d'écrire à la fois.
à lire à partir d'un chier inexistant, se traduisent par le renvoie de la valeur NULL
par la fonction fopen().
L'opération symétrique de l'ouverture d'un ot est sa fermeture. Ainsi, chaque ot
doit être fermé en n d'utilisation en exécutant l'instruction suivante :
fclose(ot);
Remarque : il existe deux ots prédénis par le langage C, qui sont respectivement le
ot entrée standard stdin et le ot de sortie standard stdout. Pour ces deux ots, qui
sont habituellement respectivement associés au clavier et à l'écran, nul besoin de les ouvrir
avec fopen() ni de les fermer avec fclose().
Un chier texte peut être créer de diverses façons. Dans ce qui suit, nous en détaillons
trois, qui sont les suivantes :
Création caractère par caractère : on peut alors faire appel à la fonction
fputc() :
qui opère comme la fonction printf (), (voir Chapitre 1), sauf que l'écriture se passe
sur un ot quelconque et non pas sur le ot de sortie standard stdout. Notez que
la chaîne indiquant le format d'écriture contient un espace qui sera imprimé dans
le ot pour que les mots ne soient pas collés les uns aux autres.
Création ligne par ligne : il est alors possible d'utiliser la fonction fputs()
comme suit :
fputs(ligne,ot); // écriture de la chaîne ligne dans un ot
à laquelle il faut passer la ligne à écrire et un pointeur sur le ot dans lequel écrire.
Il est important de savoir que cette fonction ajoute, au ot, un caractère n-de-
ligne, ('\n'), après chaque écriture.
Le code de la Figure 5.4 contient trois procédures C implémentant chacune des trois
façons de créer un chier texte décrite ci-dessus. A chaque fois, les caractères à écrire sont
récupérés sur l'entrée standard, stdin, à l'aide de la fonction d'entrée appropriée : getc(),
scanf () ou fgets().
Remarque : éviter d'utiliser la fonction gets() pour lire une ligne à partir de l'entrée
standard, car cette dernière ne contrôle pas le nombre de caractère lu. À la place, utilisez
fgets() (voir la Ligne 45 du Programme 5.4, pour un exemple d'utilisation).
Un chier texte peut être lu de diverses façons. Dans ce qui suit, nous en détaillons
trois, qui sont les suivantes :
Lecture caractère par caractère : on peut alors faire appel à la fonction fgetc()
qui, justement, permet une lecture caractère par caractère :
à laquelle il sut d'indiquer le ot à partir duquel la lecture doit être faire. Si-
gnalons que, quand la lecture atteint la n du chier associé au ot en lecture, la
fonction fgetc() retourne la constante EOF. Cette dernière est une constante pré-
dénie qui indique la n du chier ; sa valeur est Ctrl+Z (code ASCII 26) sous
Windows et Ctrl+D (code ASCII 4) sous Linux.
Lecture mot par mot : une telle lecture peut se faire à l'aide de la fonction
fscanf () :
5.4. LES FICHIERS DE CARACTÈRES 9
3 {
4 char c ;
5 FILE ∗flot ;
7 if (( f l o t = f o p e n ( nomFlot , "w" ) ) )
8 {
12 fputc (c , f l o t ) ;
13
14 fclose ( flot ) ;
15 }
16 else
17 printf ( "Echec de l'ouveture du fichier en écriture \n'" ) ;
18 }
19
22 {
23 char c h a i n e [MAX_CHAINE+ 1 ] ;
24 FILE ∗flot ;
25
26 i f ( ( f l o t =f o p e n ( nomFlot , "w" ) ) )
27 {
31 fclose ( flot ) ;
32 }
33 else
34 printf ( "Fichier non créé\n" ) ;
35 }
36
39 {
40 char l i g n e [ MAX_LIGNE+ 1 ] ;
41 FILE ∗flot ;
42
43 i f ( ( f l o t =f o p e n ( nomFlot , "w" ) ) )
44 {
46 fputs ( ligne , f l o t ) ;
47
48 fclose ( flot ) ;
49 }
50 else
51 printf ( "Fichier non créé\n" ) ;
52 }
Figure 5.4 Création de chier texte de trois façons diérentes : caractère par caractère,
mot par mot et ligne par ligne.
10 CHAPITRE 5. CHAÎNE & FICHIER DE CARACTÈRES
fscanf (ot,"%s",mot)
qui opère comme la fonction scanf () (voir Chapitre 1), sauf que la lecture se passe
sur un ot quelconque et non pas sur le ot entrée standard stdin. Signalons que,
quand la lecture atteint la n du chier associé à ot, la fonction fscanf () retourne
la constante EOF.
Lecture ligne par ligne : il est alors possible d'utiliser la fonction fgets() :
fgets(ligne,MAX_LIGNE+1,ot)
Le code détaillé dans la Figure 5.5 contient trois procédures C implémentant les trois
façons de lire un chier texte décrite ci-dessus. A chaque fois, les caractères lus sont achés
sur la sortie standard, stdout, pour s'assurer du bon déroulement de la lecture.
fseek(ot,decalage,position);
1 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
3 // / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
5 {
6 char c ;
7 FILE ∗flot ;
9 i f ( ( f l o t =f o p e n ( nomFlot , "r" ) ) )
10 {
11 while ( ( c= f g e t c ( f l o t ) ) != EOF)
12 fputc ( c , stdout ) ;
13
14 fclose ( flot ) ;
15 }
16 else
17 printf ( "Fichier non ouvert\n" ) ;
18 }
19
21 {
22 char c h a i n e [MAX_CHAINE+ 1 ] ;
23 FILE ∗flot ;
24
25 i f ( ( f l o t =f o p e n ( nomFlot , "r" ) ) )
26 {
30 fclose ( flot ) ;
31 }
32 else
33 printf ( "Fichier non ouvert\n" ) ;
34 }
35
37 {
38 char l i g n e [ MAX_LIGNE+ 1 ] ;
39 FILE ∗flot ;
40
41 i f ( ( f l o t =f o p e n ( nomFlot , "r" ) ) )
42 {
45
46 fclose ( flot ) ;
47 }
48 else
49 printf ( "Fichier non ouvert\n" ) ;
50 }
Figure 5.5 Lecture de chier texte de trois façons diérentes : caractère par caractère,
mot par mot et ligne par ligne.
12 CHAPITRE 5. CHAÎNE & FICHIER DE CARACTÈRES
1 void AjoutFlotFin ( char nomFlot [ ] )
2 {
3 char c ;
4 FILE ∗flot ;
6 if (( f l o t = f o p e n ( nomFlot , "a" ) ) )
7 {
11 fputc (c , f l o t ) ;
12
13 fclose ( flot ) ;
14 }
15 else
16 printf ( "Echec de l'ouveture du fichier en mode ajout .\n'" ) ;
17 }
La procédure C détaillée dans la Figure 5.7 permet de remplacer une ligne entière
d'un chier texte existant par une autre. Comme elle est dénie, la procédure
suppose, toutefois, que les lignes du chier à modier ont toutes la même taille.
Cette taille est déterminée par la lecture de la première ligne du chier (voir Ligne
9). Pour déterminer le nombre total de caractères à dépasser, on multiplie la taille
d'une ligne augmentée de 1, (pour compter le caractère \n), par le numéro de la
ligne qu'on veut remplacer. La fonction fseek() est alors appelée pour eectuer le
décalage (voir Ligne 11), après quoi, le remplacement de la ligne est assuré par la
fonction fputs(), (voir Ligne 12).
2 {
3 long tailLigne ;
4 char l i g n e [ MAX_LIGNE+ 1 ] ;
5 FILE ∗flot ;
7 i f ( ( f l o t =f o p e n ( nomFlot , "r+" ) ) )
8 {
9 f g e t s ( l i g n e , MAX_LIGNE+1 , f l o t ) ;
12 f p u t s ( nouvLigne , f l o t ) ;
13 fclose ( flot ) ;
14 }
15 else
16 printf ( "Fichier non ouvert\n" ) ;
17 }
Figure 5.7 Procédure C eectuant le remplacement d'une ligne par une autre dans un
chier texte.