Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du...
-
Upload
leopold-lelong -
Category
Documents
-
view
109 -
download
1
Transcript of Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du...
Lecture et écriture de données
La communication avec l’extérieur. Lecture de données à partir du clavier. Affichage des données à l’écran. Formatage des données. Parallèle entre les langages C et C++.
2
Entrées / sorties avec C Comme le langage PASCAL, C ne renferme pas d’instructions d’entrées / sorties
comme faisant partie du langage. Ainsi, on s’assure de l’indépendance de C avecl’environnement matériel.
Les outils de base sont disponibles dans la librairie stdio. Pour utiliser ces outils,il faut donc inclure cette librairie :
#include <stdio.h>
Affichage d’un caractère à partir du code entier c (un entier entre 0 et 255)représentant ce caractère :
int putchar(c);
La fonction putchar retourne ensuite le code entier c.
Si c est de type char, il est d’abord converti en un entier.
Caractères spéciaux :
\n saut de ligne\t usage du tabulateur
3
Écriture d’un caractère : exemple #include <stdio.h>
void main(){
char A = 'A';char B = '=';int C = '1';int i;putchar('U');putchar('n');putchar('\t'); // Utilisation du tabulateur.putchar(B);putchar(' ');putchar(C);putchar('\n'); // Saut de ligne.putchar('?');putchar('\n'); // Saut de ligne.i = putchar(225); // Caractère ''.putchar(i - 125); // Caractère 'd'.putchar('\n'); // Saut de ligne.
}
Un = 1?d
4
Lecture d’un caractère Lecture du prochain caractère du fichier d’entrée standard et retourne le code
entier représentant ce caractère :
int getchar();
#include <stdio.h>
void main(){
char A, B, C, D;int E;A = getchar(); B = getchar(); C = getchar();D = getchar(); E = getchar();putchar(A); putchar(B);putchar('\t'); // Utilisation du tabulateur.putchar(C); putchar(' '); putchar(D);putchar('\n'); // Saut de ligne.putchar(E);putchar('\n'); // Saut de ligne.
}Un = 1?
Un=1?
5
Lecture formatée de données Syntaxe :
int scanf("format de lecture des données ",adresse de la variable 1,adresse de la variable 2,
…,adresse de la variable n);
Cela détermine commentles données lues doiventêtre interprétées.
Les données lues permettentd’initialiser ces variables.
L’adresse d’une variable estindiquée par le nom de lavariable précédé du signe &.
#include <stdio.h>void main(){
int jour, mois, annee, k;k = scanf("%i %i %i", &jour, &mois, &annee);if(k == 3) {
putchar('O'); putchar('K'); putchar('\n');}
}
Exemple :
Cela lit 3 entiers signés, séparés par des espaces, tabulations ou sauts de ligne.
Retourne le # delectures réussies.
6
Formatage de données en lecture % * # de caractères lus h ou l L type de conversion
Indique ledébut d’unformatage
Optionnel :Indique quela donnéed’entrée seraignorée.
Optionnel :Indique le # decaractères enentrée(1).
(1) Les données peuvent être saisiessans espaces entre elles.
Optionnel :h = short (d i o u x)l ou L = long (int)
oudouble (float)
d ou i into int (les chiffres sont
assumés en base 8)u unsigned intx int (les chiffres sont
assumés en base 16)c char (l’espace est
inclus)s chaîne de caractères
(excluant l’espace)e, f ou g float (E, e ou . sont
optionnels).
Note : Une suite d’espaces, de tabulateursou de sauts de lignes est équivalentà un espace dans le fichier d’entrée.
7
Lecture formatée de données Si le format de lecture des données contient des caractères autres que l’espace,
un tabulateur ou une fin de ligne, alors ces symboles doivent être introduitsexactement dans l’ordre indiqué.
#include <stdio.h>void main(){
int jour, mois, annee;int k;k = scanf("%i/%i/%i", &jour, &mois, &annee);if(k == 3) {
putchar('O'); putchar('K'); putchar('\n');}
}
Données valides : 12/4/1980 Données invalides : 12 4 198012/04/1980 12 /4 /1980
scanf s’arrête si le format de lecture a été traité jusqu’au bout ou si une donnéene correspond pas au format indiqué.scanf retourne le # d’arguments correctement reçus et affectés.
8
Écriture formatée de données Syntaxe : int printf("format d’écriture des données ",
expression 1, expression 2, …, expression n);
Les valeurs de expression 1, expression 2, …, expression n correspondent auxdonnées à afficher et doivent coïncider avec le format d’écriture précédent.
#include <stdio.h>void main(){
int jour, mois, annee;int k;
k = scanf("%i/%i/%i", &jour, &mois, &annee);if(k == 3) printf("jour = %i, mois = %i, annee = %i\n", jour, mois, annee);else printf("Format invalide de donnees en entree.\n");
}
Si le format d’écriture est une chaîne de caractèresuniquement, alors il n’y a pas d’autres paramètres.
Si le nombre n d’expressions est plus élevé que ce qui est prévu dans le formatd’écriture, ces dernières expressions sont ignorées.
9
Formatage de données en écriture % caractère # minimum précisionh ou l L type
de de decontrôle caractères conversion
à l’impression
Indique ledébut d’unformatage
Optionnel :4 caractèressontdisponibles.
Optionnel :Si cela exige davantagede caractères, les besoinssont comblés.
Optionnel :h = shortl = longL = long double
Optionnel :.n signifie que l’on optepour une précision de nchiffres après le point.
Il s’agit dedéfinir dequelle façonune donnéeserainterprétée.
10
Formatage de données en écriture Caractères de contrôle :
+ S’assure qu’un signe précède toujours une valeur numérique signée.- Opte pour une justification à gauche avec l’espace comme caractère de remplissage (le mode de justification à droite est celui par défaut).# la lettre O va précéder une valeur en base 8, les lettres Ox ou OX vont précéder une valeur hexadécimale.espace une valeur positive ou nulle sera précédée d’un espace plutôt que d’un
signe +.
Type de conversion :
entiers :
d valeur entière décimale signéeo valeur entière octale non signéeu valeur entière décimale non signéex valeur entière hexadécimale non signée
avec les chiffres a, b, c, d, e, fX idem avec les chiffres A, B, C, D, E, F.
caractères : c un caractères une chaîne de caractères.
réels :
f valeur réelle signéee valeur réelle signée
avec un exposant eE idem mais avec Eg idem à e ou f selon
la précision et ladimension de lavaleur réelle
G idem à g mais avecE s’il y a lieu.
11
Caractères d’échappement Dans le format d’écriture des données de l’instruction printf, on peut utiliser des
caractères d’échappement :
\a signal sonore\b efface le caractère qui précède le curseur (« backspace »)\n passe à la ligne suivante\t usage du tabulateur\\,%%, \" pour afficher le caractère \, % ou ".
Exemples :
#include <stdio.h>
void main(){
printf("%4d\n%4d\n%4d\n", 123, 1234, 12345);
printf("%f\n%12f\n%.2f\n%5.0f\n%10.3f\n%.4f\n",100.123, 100.123, 100.123, 100.123, 1.23456);
}
123123412345100.123000 100.123000100.12 100 1.2350.0000
12
Exemple d’entrées / sorties Exemple :
#include <stdio.h>void main(){
int A, B;int k;char caractere;float C = 12.3456f;double D = 12.123456789;long double E = 12.3;
printf("Entrez 2 entiers au clavier : \n");k = scanf("%i %i", &A, &B);while(k != 2) {
printf("Donnees invalides. Recommencez...\n");k = scanf("%i %i", &A, &B);
}printf("%i fois %i est %li\n", A, B, (long) A * B);
13
Exemple d’entrées / sorties Exemple :
printf("Entrez un caractere : \n");scanf("\n%c", &caractere);printf("Le caractere %c a le code %i.\n", caractere, caractere);
printf("%f %f %f\n", C, D, E);printf("%e %e %e\n", C, D, E);
}
Entrez 2 entiers au clavier :1234 5671234 fois 567 est 699678Entrez un caractere :aLe caractere a a le code 97.12.345600 12.123457 12.3000001.234560e+001 1.212346e+001 1.230000e+001
14
Généralités sur les flux en C++
Un flux ou canal de données représente un ensemble de données pouvant êtremanipulé à la fois en lecture et en écriture.
Offre une transparence vis-à-vis de la source ou de la destination des donnéesc’est-à-dire
un programme peut utiliser les mêmes instructions de manipulation de fluxpour tous les types de flux de sortie (écran, fichier, mémoire)pour tous les types de flux d’entrée (clavier, fichier, mémoire).
Ex.: Un programme peut utiliser les mêmes instructions pour afficher des données àl’écran ou pour écrire ces données dans un fichier sur le disque dur.
En C++, tous les flux sont représentés par des classes qui font partie de la librairieiostream (input-output stream, pour flux d’entrées/sorties).
#include <iostream.h>
La gestion des flux se caractérise par une lecture/écriture séquentielle desdonnées.
15
Généralités sur les flux en C++ Ces classes correspondent aux différents types de flux et sont présentées
sous la forme d’une arborescence:
iosclasse de base qui regroupe
les caractéristiques communesaux flux
istream ostreamclasse de base
du flux d’entréeclasse de base du
flux de sortie
ifstream iostream ofstreamflux de sortie
surfichier
flux d’entréesur fichier
canaux standards
16
Opérateurs d’entrées / sorties en C++
Toutes les classes de la librairie iostream disposent de 2 opérateurs surchargés:<< écrire vers un flux de sortie>> lire à partir d’un flux d’entrée.
L’opérande de gauche de l’opérateur << doit correspondre à un objet de la classeostream (cout par exemple) .
L’opérande de gauche de l’opérateur >> doit correspondre à un objet de la classeistream (cin par exemple).
C++ fournit 4 flux prédéfinis:cout: correspond au flux de sortie standard (écran par défaut)
(dérivée de la classe ostream)cin: désigne le flux d’entrée standard (clavier par défaut)
(dérivée de la classe istream)cerr: désigne la sortie erreur standard (écran par défaut)
(dérivée de la classe ostream)clog: permet à la fois d’envoyer des messages d’erreurs vers la
sortie erreur standard (écran par défaut) et de remplir un fichierde log (fichier d’alerte) (dérivée de la classe ostream)
17
Surcharge avec les types de données de base
Ces 2 opérateurs << et >> ont été définis pour les types de données suivants:
char, short, int, long, float, double, long double, char * et void *.
On peut donc lire et écrire des variables de ces différents types de donnéesà l’aide de ces 2 opérateurs.
comme par exemple, cout << 'a' << 25;cin >> i ; // i est une variable de type int.
À plus tard.
En C++, les opérations d’entrées / sorties s’effectuent automatiquement enfonction du type de données. S’il n’y a pas concordance, le compilateur génèreune erreur.
En C++, même si les outils d’E/S de C sont disponibles, ne les utilisez pas.
Les opérateurs << et >> peuvent être utilisés en cascade. Ex. : cout << a << b;
18
Affichage à l’écran avec cout Ex.: #include <iostream.h>
void main(){
int entier = 12; char c = 'A';
cout << "\n\tEntier : " << entier << '\n';cout << "\tCaractere : " << c << endl;
}
saut de ligne
La librairie iostream fournit un certain nombre d’attributs ou de paramètresqui permettent de modifier les caractéristiques d’un flux.
Syntaxe: cout << manipulateur;
Usage du tabulateur
19
Usage de manipulateurs avec cout
dec Convertir en base décimale hex Convertir en base hexadécimale oct Convertir en base octale ws Supprimer les espaces endl Ajouter un saut de ligne en fin de flux ends Ajouter un caractère de fin de chaîne flush Vide un flux de sortie setbase(int n) Choisir la base (0, 8, 10 et 16). La valeur 0
correspond à la valeur par défaut (décimal). setfill(int c) Choisir le caractère de remplissage (« padding ») setprecision(int n) Indiquer le nombre de chiffres d’un nombre
décimal setw(int n) Définir la largeur du prochain champ de sortie :
facilite l’alignement. Ex. : cout << setw(8);
Manipulateur Objectif
Note : Pour employer un manipulateur de flux paramétré, vous devez inclure :#include <iomanip>.Ex.: endl n’est pas un manipulateur de flux paramétré.
20
Usage de manipulateurs avec cout Ex.: int Entier = 15;
……..cout << "Conversions" << endl;cout << "Entier : " << Entier << endl;cout << "Hexa : " << hex << Entier << endl;cout << "Oct : " << oct << Entier << endl;cout << dec;
ConversionsEntier : 15Hexa : fOct : 17
On repasse en base décimale.
21
Usage de manipulateurs avec cout Ex.: float PI = 3.14159;
……..cout << "PI : " << PI << endl;cout << "PI : " << setprecision(3) << PI << endl;cout << "PI : " << setprecision(4) << PI << endl;cout << "PI : " << setprecision(5) << PI << endl;
PI : 3.14159PI : 3.14PI : 3.142PI : 3.1416
22
Usage de fonctions avec cout
fill() Renvoyer le caractère de remplissage fill(char c) Modifier le caractère de remplissage (valide pas
seulement pour le champ de sortie suivant). L’espace est la valeur par défaut.
precision() Renvoyer la précision pour les nombres décimaux precision(int n) Modifier la précision pour les nombres décimaux setf(long flag) Modifier une propriété de formatage setf(long flag, long champ)
Modifier une propriété de formatage d’un champ d’activité particulier
width() Renvoyer la largeur d’affichage width(int n) Modifier la largeur d’affichage pour le champ de
sortie suivant puis, reprend immédiatement sa valeur par défaut.
Méthode Objectif
Fonctions disponibles dans la classe ios
23
Usage de fonctions avec cout
#include <iostream.h>void main(){
int i = 123;cout << "i = " << i << "i + 1 = " << i + 1 << endl;cout << "i = ";cout.width(6); cout.fill('0');cout << i;cout << "i + 1 = ";cout << i + 1;cout << "i + 2 = ";cout.width(5);cout << i + 2 << endl;
}
i = 123i + 1 = 124i = 000123i + 1 = 124i + 2 = 00125
La fonction setf avec cout Ex.: Utilisation de la fonction setf() pour modifier l’alignement des colonnes
affichées i.e. choisir d’aligner à gauche ou à droite les éléments affichés.
cout.setf(ios::right, ios::adjustfield);cout << setw(12) << "AAA" << endl;cout << setw(12) << "BBBBBB" << endl;
AAABBBBBB
alignement à droite
sous réserve que lataille d’affichage soit
spécifiée
Alignement à gauche: cout.setf(ios::left, ios::adjustfield);
Note : D’autres options sont disponibles : ios::showpoint afficher les zéros de droite (20.00 au lieu de 20), ios::showpos afficher le signe + devant les nombres positifs, ios::hex afficher le nombre en base 16, ios::scientific afficher une valeur à virgule flottante en notation scientifique, ios::fixed afficher une valeur à virgule flottante en notation à virgule fixe.
25
La fonction setf avec les paramètres setw et setfill
Ex.: float Decimal = 10.25;……..cout.setf(ios::right, ios::adjustfield);cout << "Decimal : " << setw(8) << Decimal << endl;cout << "Decimal : " << setw(8) << (Decimal + 100) << endl;cout << "Decimal : " << setw(8) << (Decimal+1000) << endl;cout << "Decimal : " << setw(8) << setfill('0') << Decimal << endl;
Decimal : 10.25Decimal : 110.25Decimal : 1010.25Decimal : 00010.25
26
Saisie au clavier avec cinSaisie au clavier avec cin
L’objet cin est employé pour saisir des informations au clavier.
défini à partir d’une classe dérivée de istream.
utilise l’opérateur surchargé >> pour saisir au clavier les valeurs° des variables de type primaire (char, int, float, etc.)° des chaînes de caractères.
Ex.: int i; char c; float f1, f2;…..cout << "Saisissez un nombre: " ;cin >> i;…..cout << "Saisissez un caractere: " ;cin >> c;
…..cout << "Saisissez 2 nombres reels: " ;cout << "Un espace entre les 2 nombres reels: ";cin >> f1 >> f2;
27
Saisie au clavier avec cinSaisie au clavier avec cin
Il n’y a pas de contrôle de type au moment de la saisie.
La variable sera considérée invalide uniquement à l’issue de lasaisie.
Il est donc possible de saisir des caractères dans une variable entière.
#include <iostream.h>void main(){
char c;
while (true){
cin >> c;if (c == '.') break;cout << c;
}}
Fait abstraction des espaces.
a c def.acdef
28
Saisie au clavier avec la fonction get de cinSaisie au clavier avec la fonction get de cin
get avec un paramètre de type char permet d’examiner chaque caractère,y compris les espaces. La fonction retourne un objet de la classe iostream.
char a, b, c;char d, e;cin.get(a).get(b).get(c);cin.get(d) >> e;
#include <iostream.h>void main(){
char c;
while (true){
cin.get(c);if (c == '.') break;cout << c;
}}
a c def. a c def
Note : put permet d’écrire un caractère : cout.put('O').put('h').put('\n');
29
Saisie au clavier avec les fonctions ignore, peek et putback de cinSaisie au clavier avec les fonctions ignore, peek et putback de cin
La fonction ignore permet d’ignorer les caractères restants sur une ligne.2 paramètres : le nombre maximum de caractères à ignorer et le caractère de fin.
Ex.: cin.ignore(80, '\n');
La fonction peek permet d’examiner sans extraire le prochain caractère.
Ex.: #include <iostream.h>void main(){
char c;while (true){
if( cin.peek() == '.') break;cin >> c;cout << c;
}}
abcdef.abcdef
30
Saisie au clavier avec les fonctions ignore, peek et putback de cinSaisie au clavier avec les fonctions ignore, peek et putback de cin
#include <iostream.h>void main(){
char c;
while (true){
if( cin.peek() == '.') break;cin.get(c);if ( c == 'b') cin.putback('B');else cout << c;
}}
Exemple :
La fonction putback permet d’insérer un caractère dans le flux d’entrée.
abcbbdef.aBcBBdef
31
Saisie au clavier avec les fonctions ignore, peek et putback de cinSaisie au clavier avec les fonctions ignore, peek et putback de cin
#include <iostream.h>void main(){
char c;
cout << "Entrez une phrase : ";
while (true){
cin.get(c);if ( c == '.') break;if ( c == '!') cin.putback('$');
else cout << c;while (cin.peek() == '#') cin.ignore(1, '#');
}}
Exemple :
Ceci# est!un! essai##!.Ceci est$un$ essai$