2.5- Les flux. 1- Librairies de flux. 2- Manipulation de cin. 3- Lecture et écriture de fichiers. 4- Les flux et les chaînes



Documents pareils
1.6- Génération de nombres aléatoires

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Programmation système I Les entrées/sorties

I. Introduction aux fonctions : les fonctions standards

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Programmation système en C/C++

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Introduction au pricing d option en finance

COMPARAISONDESLANGAGESC, C++, JAVA ET

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Chapitre 2. Classes et objets

Cours d Algorithmique et de Langage C v 3.0

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Compression de Données - Algorithme de Huffman Document de Conception

TP : Gestion d une image au format PGM

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Initiation à la programmation en Python

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Programmation C++ (débutant)/instructions for, while et do...while

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

3IS - Système d'exploitation linux - Programmation système

INFO-F-105 Language de programmation I Séance VI

Cours 6 : Tubes anonymes et nommés

TP1. Outils Java Eléments de correction

IMPORTATION, CRÉATION, MANIPULATION, EXPORTATION DE DONNÉES STATISTIQUES

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Systeme d'exploitation

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Claude Delannoy. 3 e édition C++

Généralités sur le Langage Java et éléments syntaxiques.

Cours 14 Les fichiers

TP, première séquence d exercices.

TD/TP PAC - Programmation n 3

Présentation du langage et premières fonctions

Introduction à l héritage en C++

Les chaînes de caractères

Programmation par les Objets en Java

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

et Programmation Objet

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

TD/TP PAC - Programmation n 3

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Chapitre 1 : Introduction aux bases de données

Introduction à C++ et à wxwidgets

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

GESTION DES FICHIERS C/UNIX

Cours d initiation à la programmation en C++ Johann Cuenin

Le langage C. Séance n 4

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Tp 1 correction. Structures de données (IF2)

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1. Structure d'un programme FORTRAN 95

SOMMAIRE... 1 ESPACE DU CLUB...

Programmation C. Apprendre à développer des programmes simples dans le langage C

Séance 0 : Linux + Octave : le compromis idéal

Cyberclasse L'interface web pas à pas

Je communique par

RMI le langage Java XII-1 JMF

Programmation en C/C++

Création d objet imbriqué sous PowerShell.

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Héritage presque multiple en Java (1/2)

Le prototype de la fonction main()

Le stockage local de données en HTML5

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

TD3: tableaux avancées, première classe et chaînes

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Programmation Objet - Cours II

ACTIVITÉ DE PROGRAMMATION

Exercices sur les interfaces

l'ordinateur les bases

Gestion d utilisateurs et stratégie systèmes.

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

SYSTÈME DE GESTION DE FICHIERS

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Cours 420-KEG-LG, Gestion de réseaux et support technique. Atelier No2 :

TP 1. Prise en main du langage Python

Une introduction à Java

Cours de C/C++ par la pratique. Hugues Talbot

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Import des utilisateurs depuis Sconet et STSweb - mise à jour du 04/10/06

BTS 2 SIO Active directory- windows serveur 2012 Version 1.1 (12/12/2014)

Chapitre 10. Les interfaces Comparable et Comparator 1

DECOUVERTE DE LA MESSAGERIE GMAIL

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

I La création d'un compte de messagerie Gmail.

Gérer ses fichiers et ses dossiers avec l'explorateur Windows. Février 2013

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Guide d'installation du connecteur Outlook 4

Programmation impérative

Cours Langage C/C++ Programmation modulaire

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Package Java.util Classe générique

Transcription:

2.5- Les flux 1- Librairies de flux 2- Manipulation de cin 3- Lecture et écriture de fichiers 4- Les flux et les chaînes 5- Passage de paramètres en ligne de commande 6- Un exemple de récupération CSV Depuis le premier exemple développé dans le chapitre 1.1, on utilise la librairie iostream et notamment l'objet std::cout qui un flux vers l'invite de commandes Windows ou le shell Linux. Les objets flux gèrent l'interfaçage vers les différents éléments et peuvent être conçus de manière assez complexe. Par exemple, les flux vers les fichiers peuvent intégrer une mémoire tampon : pour éviter d'accéder constamment au disque dur (lent), le flux remplit une mémoire tampon au fur et à mesure des instructions d'écriture qui apparaissent dans le code. L'écriture sur le disque se fait alors en une seule fois, lorsque le tampon est plein (ou selon d'autres modalités). 1- Librairies de flux On a déjà utilisé la librairie iostream : celle ci contient quatre variables objet. Une variable de type istream (flux entrant) : cin et trois variables de types ostream (flux sortant) : cout, cerr, clog. Deux autres librairies de flux vont être évoquées dans ce cours. <fstream> est une librairie qui permet de manipuler des fichiers. <sstream> est une librairie qui permet de manipuler les string comme si elles étaient des flux. On peut trouver une visualisation plus complète des librairies de flux : http://www.cplusplus.com/reference/iostream/. Si on teste les flux cerr et clog par défaut, on constate qu'ils écrivent sur l'invite de commande à l'instar de cout. Noter qu'on peut

rediriger les flux, ce qui n'est pas évoqué ici. La redirection des flux consiste à orienter le flux cout (ou cerr ou clog) vers un fichier par exemple, et non plus vers l'invite de commandes. De manière générale, un stream ou flux est un objet qui transporte et formate des caractères. Deux grandes catégories : istream (un flux en entrée) et ostream (un flux de sortie). Pour les objets-flux d'entrée, on a ifstream (flux d'import depuis un fichier), istringstream (flux d'entrée depuis une chaîne de caractères). Pour les objets-flux de sortie, on a ofstream (flux d'export vers un fichier), ostringstream (flux de sortie vers une chaîne). Deux opérateurs sont utilisés : << qui est un opérateur d'insertion (on met les données dans un flux), >> qui est n opérateur d'extraction (on récupère des données depuis un flux). 2- Manipulation de cin cin a déjà été évoqué dans le chapitre 1.2. On développe un exemple proche de celui proposé en 1.2 : double x,y; std::cout << "Rentrer une premiere valeur\n"; std::cin >> x; std::cout << "Rentrer une seconde valeur\n"; std::cin >> y; std::cout << "x : " << x << "\ty : " << y << "\n"; Dans ce code, std::cin >> x envoie le contenu du flux dans x. L'utilisateur valide une saisie en utilisant la touche entrée. En plus des valeurs numériques, cin peut gérer les arguments de type char*. char prenomutilisateur[100]; cout << "Quel est votre prenom?\n"; cin >> prenomutilisateur; std::cout << "A ete saisi : " << prenomutilisateur << "\n"; cin rajoute automatiquement \0 à la fin de la chaîne qui a été saisie. Si l'utilisateur saisi "Jean", alors la chaîne enregistrée est : 'J' 'e' 'a' 'n' '\0' Attention aux erreurs si on ne prévoit pas un buffer de caractères de taille suffisante (un tableau de taille suffisante dans le code

qui précède) : dans ce cas, le buffer affectera une partie de la mémoire qui n'a pas été réservée à cet effet, avec les conséquences que l'on sait que cela peut avoir (détournement de mémoire destinée à un autre usage). L'objet cin, lorsqu'il traite une entrée, considère les espaces ' ' comme des retours à la ligne '\n'. Soit dans le cas du code précédent, si l'utilisateur saisi un prénom avec un espace au milieu, seul le premier prénom sera affiché. Un exemple d'exécution à partir du code précédent : C:\CPP>re Quel est votre prenom? Jean Charles A ete saisi : Jean On peut renseigner plusieurs variables à la fois : int main() char prenomutilisateur[100],nomutilisateur[100]; cout << "Donnez votre nom et votre prenom : \n"; cin >> nomutilisateur >> prenomutilisateur; int age,taille; cout << "Donnez votre age et votre taille en cm\n"; cin >> age >> taille; cout << "Vous etes : " << prenomutilisateur << " " << nomutilisateur << ", d'age " << age << "an, de taille "<< taille << "cm\n"; Généralement, l'utilisateur rentrera son nom et son prénom sur une même ligne avec un espace entre les deux, de fait, la machine considérera qu'il y a deux saisies et renseignera la chaîne nomutilisateur et la chaine prenomutilisateur. Ensuite, l'utilisateur va rentrer une taille, soit il met un espace, soit il valide par entrée, dans les deux cas, la machine attendra une seconde valeur pour poursuivre l'exécution. Pour lire l'ensemble des caractères en une seule fois, on utilise la fonction get : int main() char identite[100]; cout << "Donnez votre nom et votre prenom : \n"; cin.get(identite,99); cout << "identite\n";

Pour connaître le nombre des caractères contenus dans le flux : cin.gcount. 3- Lecture et écriture de fichiers Les classes ofstream et ifstream La classe ofstream permet d'écrire des données sur les fichiers, la classe ifstream permet de lire des données dans un fichier. Il est toujours important d'utiliser la fonction close() des objets ofstream ou ifstream qui sont créés, notamment pour libérer les ressources systèmes liées à ces objets et en particulier pour vider la mémoire tampon associée au flux sur le fichier. Un premier exemple : écrire dans un fichier Un exemple le plus simple possible pour créer et remplir un fichier texte : #include <fstream> //cette librairie est nécessaire pour la manipulation des fichiers, elle contient la classe ofstream using namespace std; // avec fstream, on est toujours dans la librairie standard et donc dans l'espace de nom std. int main() ofstream fluxfichier("c:\\cpp\\output\\test.txt"); // l'objet flux sur fichier est créé fluxfichier << "Les sanglots longs des violons de l'automne...\n"; fluxfichier.close(); //On ferme le flux sur fichier, le tampon est vidé. Un autre exemple, on va générer un certain nombre de valeurs aléatoires selon une gaussiennes pour fournir une série de nombres aléatoires et les stocker dans un fichier. #include <fstream> //cette librairie est nécessaire pour la manipulation des fichiers, elle contient la classe ofstream #include <iostream> #include <cstdlib> #include <ctime> #include <cmath> using namespace std;

double randomuniform() return rand()/(double)rand_max; void polarmarsaglia(double *x1,double *x2) double W,V1,V2; do double U1=randomUniform(); double U2=randomUniform(); V1=2*U1-1; V2=2*U2-1; W=V1*V1+V2*V2; while(w>1); /*Apres cette étape, V1 et V2 ont été tirés de manière uniforme sur [-1;1] / V2²+V1²<=1*/ double W_function=sqrt(-2*log(W)/W); *x1=v1*w_function; *x2=v2*w_function; int main() ofstream fluxfichier("c:\\cpp\\output\\test.txt"); // l'objet flux sur fichier est créé fluxfichier << "Le fichier contient une serie de nombres aleatoires generes selon une loi gaussienne\n"; double x1,x2; for(int i=0;i<1000000;i++) polarmarsaglia(&x1,&x2); fluxfichier << i << " " << x1 << " " << x2 << "\n"; fluxfichier.close(); //On ferme le flux sur fichier, le tampon est vidé. Dans le code qui précède, lors de la création de l'objet ofstream, la machine tente d'ouvrir le fichier c:\cpp\output\test.txt. Si ce fichier n'existe pas, il sera crée (à condition que le répertoire existe lui), si le fichier existe, il sera écrasé.

Un exemple de lecture depuis un fichier #include <fstream> //cette librairie est nécessaire pour la manipulation des fichiers, elle contient la classe ifstream #include <iostream> int main() std::ifstream lecturefichier("c:\\cpp\\output\\test.txt"); char ch; while(lecturefichier.get(ch)) std::cout << ch << "\n"; std::cout << "Fin de la lecture du fichier\n"; lecturefichier.close(); Noter qu'ici, comme on n'a pas mis using namespace std;, on travaille avec std::ifstream : le nom de la classe ifstream ne serait pas reconnu sinon. Ici, on utilise la fonction get(char) de ifstream qui pointe à tout moment sur un caractère. Au début, ifstream pointe sur le premier caractère. Au premier appel de get(ch), il affecte le premier caractère à ch puis pointe sur le deuxième caractère etc... Au final, get(char) renvoie faux. Modifier le comportement à l'ouverture des fichiers Pour l'instant, on utilise le constructeur ofstream qui prend une chaîne de caractères char* en entrée et crée le fichier qui correspond au chemin si celui n'existe pas, si ce fichier préexiste, il sera effacer. On peut également vouloir écrire à la fin du fichier sans effacer les données précédentes. Pour cela, on utilise des attributs que l'on passe en argument au constructeur : char *chemin="c:\\cpp\\output\\test.txt"; ofstream flux1(chemin,ios::app); // ajoute les données à la fin du fichier que l'on ouvre ofstream flux2(chemin,ios::noreplace); // le fichier sera ouvert si il n'existe pas déjà ofstream flux3(chemin,ios::nocreate); // le fichier sera ouvert seulement si il existe déjà

4- Les flux et les chaînes Istringstream : un flux d'input depuis une string A partir d'une string, on peut construire un flux isstringstream. A partir de ce flux, il est possible d'extraire des valeurs. Soit par exemple le code suivant : #include <sstream> #include <iostream> using namespace std; int main() string str("5 12.7\nParis"); istringstream in(str); int i;double d; char chaine1[10]; in >> i >> d >> chaine1; // recuperation des valeurs de la chaîne de caractères vers des variables std::cout << i << " " << d << " " << chaine1 << "\n"; Dans ce code, on crée un objet istringstream à partir d'une chaîne. Istringstream est une classe définie dans sstream. On peut ensuite extraire les valeurs depuis la chaîne. L'objet istringstream permet donc d'obtenir des valeurs numériques à partir des string. L'utilisation de ce type d'objet coexiste avec une autre méthode qui est celle issue du C et qui propose deux fonctions atoi() et atof() qui permettent d'obenir des int ou des float à partir de chaînes. On préfera bien sûr utiliser la méthode reposant sur les objets istringstream. ostringstream Il est possible d'utiliser ostringstream qui est un flux de sortie : on y adresse du contenu puis on extraie une chaîne à partir du ostringstream : #include <sstream> #include <iostream>

using namespace std; int main() int n=12000; string str("place de la Republique"); ostringstream out; out << "A la date du 12 mai 1995, se retrouveaient " << n << " personnes " << str; string str2=out.str(); std::cout << str2; Ce type de démarche permet de concaténer tout type de variables pour obtenir une chaîne (un objet string). 5- Passages de paramètres en ligne de commande Il existe un autre prototype pour la fonction main : #include <iostream> int main(int argc,char **argv) std::cout << "arguments " << argc << "\n"; for(int i=0;i<argc;i++) std::cout << "argument " << i << " : " << argv[i] << "\n"; En enregistrant ce code dans un fichier test.cpp et en compilant pour créer l'exécutable test.exe, on peut ensuite faire ce type de passage de ligne de commande : test chaine1 12 chaine2 On obtient alors comme résultat affiché : C:\CPP>re chaine1 12 chaine2 arguments 4 argument 0 : re argument 1 : chaine1 argument 2 : 12

argument 3 : chaine2 Ie, on peut récupérer des paramètres passés en ligne de commande. On pourra ainsi utiliser l'invite de commande pour passer des paramètres pour certains programmes. Par exemple, on pourra passer un chemin pour les fichiers produit par le programme, ou bien une URL etc... à voir en fonction du programme. 6- Un exemple de récupération CSV Pour finir ce code, on propose un code de lecture d'un fichier CSV. On donne dans un premier temps la fonction qui permet d'obtenir un vecteur de vecteur de string depuis le fichier CSV. vector< vector<string> > recuperationcsv(string chemin) vector< vector<string> > liste; /*Ouverture du fichier*/ ifstream in(chemin.c_str()); string line; int comptelignes=0; /*Pour toute ligne du fichier*/ while(getline(in, line)) if(line[0]!='#') //std::cout << line << "\n"; vector<string> donneeslignecourante; int indice=0; while(indice<line.size()) string str(""); while(indice<line.size() && line[indice]!=' ' && line[indice]!='\t' && line[indice]!=',') str+=line[indice]; indice++; donneeslignecourante.push_back(str);

line[indice]=='\n')) while(indice<line.size() && (line[indice]==' ' line[indice]=='\t' line[indice]==',' indice++; liste.push_back(donneeslignecourante); return liste; Un exemple d'utilisation de ce code avec un fichier récupéré depuis yahoo!finance. Après avoir téléchargé le fichier AAF.txt sur le disque dur (qui correspond à l'une des actions sur yahoo), on utilise la fonction précédente pour récupérer une collection de collection de chaînes. Puis, dans le main, on met la série des cours dans une collection de double en inversant l'ordre des données (dans le fichier AAF.txt, les premiers cours donnés sont les plus récents, tandis que dans la collection cours, les premiers cours sont les plus anciens). #include <string> #include <iostream> #include <fstream> #include <sstream> #include <vector> using namespace std; vector< vector<string> > recuperationcsv(string chaine); int main() std::cout << "coucou\n"; /*On recupere l'ensemble du fichier*/ vector<vector <string> > v=recuperationcsv(string("d:\\enseignement\\cpp\\partie2\\aaf.txt")); /*on inverse la série des cours*/ vector< double> cours; for(int i=v.size()-1;i>=0;i--) string str=v.at(i).at(v.at(i).size()-1); istringstream in(str); double d;

in >> d; cours.push_back(d); for(int i=0;i<cours.size();i++) std::cout << cours.at(i) << "\n"; system("pause"); vector< vector<string> > recuperationcsv(string chemin) vector< vector<string> > liste; /*Ouverture du fichier*/ ifstream in(chaine.c_str()); string line; int comptelignes=0; /*Pour toute ligne du fichier*/ while(getline(in, line)) if(line[0]!='#') //std::cout << line << "\n"; vector<string> donneeslignecourante; int indice=0; while(indice<line.size()) string str(""); while(indice<line.size() && line[indice]!=' ' && line[indice]!='\t' && line[indice]!=',') str+=line[indice]; indice++; donneeslignecourante.push_back(str); line[indice]=='\n')) while(indice<line.size() && (line[indice]==' ' line[indice]=='\t' line[indice]==',' indice++;

liste.push_back(donneeslignecourante); return liste;