Vous êtes sur la page 1sur 37

C++ : fichiers

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

Avril 2018 1 / 22
Plan

1 Introduction

2 Fichiers de code

3 Fichiers de données

Avril 2018 2 / 22
Introduction

C++

Les fichiers ?
I c

Un des premiers supports de stockage EL
H
Dans ce cours, on va détailler M
OU
f E L
h re
les fichiers de code
c
source

c A de données
les fichiers

Avril 2018 3 / 22
Fichiers de code

C++

Les fichiers de code, pourquoi ?


I c

Permettant de mieux structurer le code (les L H
Efonctions)
O U
Deux types de fichier avec C++ M
E L
f prototypes
h r
.h : pour déclarer
c eles de nos fonctions

c A implémenter les prototypes déclarés dans le fichier .h


.cpp : pour

Avril 2018 4 / 22
Fichiers de code

C++

Les fichiers, comment (avec CodeBlocks) ?


Aller dans File > New > File
I c
Choisir C/C++ header ensuite cliquerU sur
H
EGoL puis sur Next >
O
Mwith
E
Saisir calcul dans Filename
f L full path ensuite
h
cocher les deux cases
c re Debug et Release
Valider
A sur Finish
cen cliquant
Refaire la même chose en choisissant cette fois C/C++ source

Avril 2018 5 / 22
Fichiers de code

C++

Commençons par inclure calcul.h dans calcul.cpp


I c

#include "calcul.h"
ELH
U
L MO
f E
c hre
c A

Avril 2018 6 / 22
Fichiers de code

C++

Commençons par inclure calcul.h dans calcul.cpp


I c

#include "calcul.h"
ELH
U
L MO
Pour les fichiers d’enth
f E
redéfinis par le développeur, on utilise les " "
ête
à la place de < A c
c >

Avril 2018 6 / 22
Fichiers de code

C++
Code généré dans calcul.h
#ifndef CALCUL_H_INCLUDED
#define CALCUL_H_INCLUDED

I c

ELH
U
MO
#endif // CALCUL_H_INCLUDED

fE L
c h r e
c A

Avril 2018 7 / 22
Fichiers de code

C++
Code généré dans calcul.h
#ifndef CALCUL_H_INCLUDED
#define CALCUL_H_INCLUDED

I c

ELH
U
MO
#endif // CALCUL_H_INCLUDED

fE L
c h r e
c A
Remarques

Le code généré dans calcul.h permet d’éviter les inclusions


multiples de ce fichier.
Les prototypes doivent être situés entre avant la dernière ligne
#endif // CALCUL H INCLUDED
Avril 2018 7 / 22
Fichiers de code

C++
Déplaçons maintenant la fonction somme dans calcul.cpp
#include "calcul.h"

int somme (int a, int b)


{
I c

return a + b;
ELH
U
MO
}

f E L
c hre
c A

Avril 2018 8 / 22
Fichiers de code

C++
Déplaçons maintenant la fonction somme dans calcul.cpp
#include "calcul.h"

int somme (int a, int b)


{
I c

return a + b;
ELH
U
MO
}

f E L
h redans calcul.h
Déclarons son prototype
c
#ifndef c A
CALCUL_H_INCLUDED
#define CALCUL_H_INCLUDED

int somme (int a, int b);

#endif // CALCUL_H_INCLUDED
Avril 2018 8 / 22
Fichiers de code

C++

Nouveau contenu de la fonction principale


#include <iostream>
#include "calcul.h"
I c

using namespace std; ELH
U
L MO
int main()
f E
{
c hre
c A
int x = 2, y = 3;

int resultat = somme (x, y);
cout << "Le resultat est " << resultat << endl;
return 0;
}

Avril 2018 9 / 22
Fichiers de code

C++
Exemple avec un type avancé (string, vector...) : code de calcul.cpp

#include "calcul.h"

int somme (int a, int b)


{
I c

return a + b;
ELH
}
U
L MO
E
int nbrVoyelle(std::string str)
f
hre
{
int nbr = 0;
c
c A

for(char c: str){
if (c == ’a’ || c == ’o’ || c == ’e’ || c == ’u’ || c == ’i
’ || c == ’y’)
nbr++;
}
return nbr;
}

Avril 2018 10 / 22
Fichiers de code

C++

Contenu de calcul.h
#ifndef CALCUL_H_INCLUDED
I c

#define CALCUL_H_INCLUDED
ELH
U
#include <string>
L MO
f E
e b);
rint
c h
int somme (int a,

c A
int nbrVoyelle(std::string str);

#endif // CALCUL_H_INCLUDED

Avril 2018 11 / 22
Fichiers de code

C++
Contenu de la fonction principale
#include <iostream>
#include "calcul.h"

I c

using namespace std;
ELH
U
int main()
L MO
{
f E
c hre
int x = 2, y = 3;
c A

int resultat = somme (x, y);
cout << "Le resultat est " << resultat << endl;
cout << "Le nombre de voyelle dans bonjour est "
<< nbrVoyelle("bonjour") << endl;
return 0;
}

Avril 2018 12 / 22
Fichiers de données

C++

Les fichiers de données, pourquoi ?

I c
Permettant de lire et écrire des données utilisées dans un

programme
EL H
Plusieurs étapes pour l’utilisation d’un U
M O fichier
inclusion de la librairie E
f L
fstream (pour file stream)
r e
ch fichier en lecture ou en écriture
déclaration d’un

c
Ouverture
A
utilisation
fermeture

Avril 2018 13 / 22
Fichiers de données

C++
Pour inclure la librairie fstream
#include <fstream>

I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 14 / 22
Fichiers de données

C++
Pour inclure la librairie fstream
#include <fstream>

Pour déclarer un fichier d’écriture


ofstream file;
I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 14 / 22
Fichiers de données

C++
Pour inclure la librairie fstream
#include <fstream>

Pour déclarer un fichier d’écriture


ofstream file;
I c

ELH
U
MO
Pour ouvrir un fichier
file.open("fichier.txt");
f E L
c hre
c A

Avril 2018 14 / 22
Fichiers de données

C++
Pour inclure la librairie fstream
#include <fstream>

Pour déclarer un fichier d’écriture


ofstream file;
I c

ELH
U
MO
Pour ouvrir un fichier
file.open("fichier.txt");
f E L
c hre
Explication
c A

fichier.txt est le nom de notre fichier sur le disque

Il se trouve dans le même dossier que nos fichiers sources, s’il n’existe pas il sera créé et
s’il existe il sera écrasé

Il est possible d’indiquer un chemin différent : par exemple


file.open("C:/Users/elmou/fichier.txt");

Avril 2018 14 / 22
Fichiers de données

C++
Avant d’utiliser le fichier, on teste si le fichier a été ouvert avec succès
if(file)
{
// Ouverture réussie, on peut utiliser le fichier
}
else
I c

{
cout << "Problème d’ouverture de fichier" << endl;
ELH
}
U
L MO
f E
c hre
c A

Avril 2018 15 / 22
Fichiers de données

C++
Avant d’utiliser le fichier, on teste si le fichier a été ouvert avec succès
if(file)
{
// Ouverture réussie, on peut utiliser le fichier
}
else
I c

{
cout << "Problème d’ouverture de fichier" << endl;
ELH
}
U
L MO
f E
hre
Pour écrire dans le fichier

c
c A
if (file)
{
file <<
file <<
"bonjour" << endl;
’a’ << endl;
file << 85 << endl;
}
else
{
cout << "Problème d’ouverture de fichier" << endl;
}

Avril 2018 15 / 22
Fichiers de données

C++
Avant d’utiliser le fichier, on teste si le fichier a été ouvert avec succès
if(file)
{
// Ouverture réussie, on peut utiliser le fichier
}
else
I c

{
cout << "Problème d’ouverture de fichier" << endl;
ELH
}
U
L MO
f E
hre
Pour écrire dans le fichier

c
c A
if (file)
{
file <<
file <<
"bonjour" << endl;
’a’ << endl;
file << 85 << endl;
}
else
{
cout << "Problème d’ouverture de fichier" << endl;
}

Avril
` 2018 15 / 22
Fichiers de données

C++
Pour écrire à la fin du fichier, on ajoute le paramètre app (pour append)

file.open("fichier.txt", ios::app);

I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 16 / 22
Fichiers de données

C++
Pour écrire à la fin du fichier, on ajoute le paramètre app (pour append)

file.open("fichier.txt", ios::app);

I c

Pour fermer
ELH
U
MO
if (file)
{
f E L
hre
file << "bonjour" << endl;

c
file << ’a’ << endl;

c A
file << 85 << endl;

file.close();
}
else
{
cout << "Problème d’ouverture de fichier" << endl;
}

Avril 2018 16 / 22
Fichiers de données

C++
Pour déclarer un fichier de lecture (input file stream)
ifstream file;

I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 17 / 22
Fichiers de données

C++
Pour déclarer un fichier de lecture (input file stream)
ifstream file;

I c

Pour ouvrir un fichier
ELH
U
MO
file.open("fichier.txt");

f E L
c hre
c A

Avril 2018 17 / 22
Fichiers de données

C++
Pour déclarer un fichier de lecture (input file stream)
ifstream file;

I c

Pour ouvrir un fichier
ELH
U
MO
file.open("fichier.txt");

f E L
c hre
c A

Trois fonctions/opérateurs pour lire le contenu

get() permet de lire un caractère


getline() permet de lire une ligne
>> permet de lire un mot

Avril 2018 17 / 22
Fichiers de données

C++
Pour lire le fichier ligne par ligne
if(file)
{
string line;
while(get(file, line))
I c

{
ELH
U
MO
cout << line << endl;
}
f E L
}
c hre
c A
else
{
cout << "Problème d’ouverture de file" << endl;
}

Avril 2018 18 / 22
Fichiers de données

C++
Pour lire le fichier ligne par ligne
if(file)
{
string line;
while(get(file, line))
I c

{
ELH
U
MO
cout << line << endl;
}
f E L
}
c hre
c A
else
{
cout << "Problème d’ouverture de file" << endl;
}

getline() : place la ligne suivante dans line et retourne true. S’il


n’y a plus de ligne à lire, elle retourne false.
Avril 2018 18 / 22
Fichiers de données

C++
Pour lire le fichier caractère par caractère
if(file)
{
char c;
while(file.get(c))
I c

{
ELH
U
MO
cout << c << endl;
}
f E L
}
c hre
c A
else
{
cout << "Problème d’ouverture de file" << endl;
}

Avril 2018 19 / 22
Fichiers de données

C++
Pour lire le fichier caractère par caractère
if(file)
{
char c;
while(file.get(c))
I c

{
ELH
U
MO
cout << c << endl;
}
f E L
}
c hre
c A
else
{
cout << "Problème d’ouverture de file" << endl;
}

get() : place le caractère suivant dans line et retourne true. S’il


n’y a plus de caractère à lire, elle retourne false.
Avril 2018 19 / 22
Fichiers de données

C++
Pour lire le fichier mot par mot
if(file)
{
string word;
I c

while (file >> word)
ELH
{
U
cout << word << endl;
L MO
}
f E
}
c hre
else
{
c A

cout << "Problème d’ouverture de file" << endl;
}

Avril 2018 20 / 22
Fichiers de données

C++
Pour lire le fichier mot par mot
if(file)
{
string word;
I c

while (file >> word)
ELH
{
U
cout << word << endl;
L MO
}
f E
}
c hre
else
{
c A

cout << "Problème d’ouverture de file" << endl;
}

Les séparateurs considérés sont l’espace et le retour à la ligne


Avril 2018 20 / 22
Fichiers de données

C++

Remarque
I c

H
Il est aussi possible de lire un nombre entier ou réel.
EL
U
L MO
f E
c hre
c A

Avril 2018 21 / 22
Fichiers de données

C++

Remarque
I c

H
Il est aussi possible de lire un nombre entier ou réel.
EL
U
L MO
f E
Exemple
c hre
double x; c A

file >> x;

Avril 2018 21 / 22
Fichiers de données

C++

Pour supprimer un fichier


if (remove("fichier.txt") == 0)
I c

{
ELH
U
MO
cout << "Fichier supprimé avec succès" << endl;
}
f E L
hre
else
c
c A
{

}

cout << "Suppression impossible" << endl;

Avril 2018 22 / 22

Vous aimerez peut-être aussi