Outils d'utilisateurs

Outils du Site


fichier

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

fichier [2016/05/06 01:13]
gbdivers
fichier [2016/05/08 18:13] (Version actuelle)
gbdivers
Ligne 19: Ligne 19:
  
 int main() { int main() {
-    std::ofstream file("test.txt");+    std::ofstream file "test.txt" };
     return 0;     return 0;
 } }
Ligne 42: Ligne 42:
  
 Avec ''std::ofstream'', la fonction ''ls'' affiche : Avec ''std::ofstream'', la fonction ''ls'' affiche :
- 
  
 <code> <code>
Ligne 64: Ligne 63:
 <code cpp> <code cpp>
 int main() { int main() {
-    std::ofstream file("test.txt");  // création de la variable "file"+    std::ofstream file "test.txt" };  // création de la variable "file"
     return 0;     return 0;
-                                   // destruction de la variable "file"+                                      // destruction de la variable "file"
 </code> </code>
  
Ligne 95: Ligne 94:
 int main() { int main() {
     {     {
-        std::ofstream file("test.txt");  // ouverture du fichier en écriture +        std::ofstream file "test.txt" };  // ouverture du fichier en écriture 
-        file << ...                      // écriture des données +        file << ...                         // écriture des données 
-    }                                    // fermeture du fichier+    }                                       // fermeture du fichier
     {     {
-        std::ifstream file("test.txt");  // ouverture du fichier en lecture +        std::ifstream file "test.txt" };  // ouverture du fichier en lecture 
-        file >> ...                      // lecture des données +        file >> ...                         // lecture des données 
-    }                                    // fermeture du fichier+    }                                       // fermeture du fichier
     return 0;     return 0;
 } }
Ligne 116: Ligne 115:
  
 int main() { int main() {
-    std::ofstream file("test.txt");+    std::ofstream file "test.txt" };
     file << "Hello word! " << std::endl;     file << "Hello word! " << std::endl;
     file << 1234 << std::endl;     file << 1234 << std::endl;
Ligne 138: Ligne 137:
 Pour rappel, ''std::endl'' force également l'écriture des données dans le tampon mémoire (//flush//). Pour éviter cela, il est possible d'utiliser le caractère "retour à la ligne" ''\n''. Dans ce cours, les performances ne sont pas critiques, l'utilisation de ''std::endl'' sera privilégiée. Pour rappel, ''std::endl'' force également l'écriture des données dans le tampon mémoire (//flush//). Pour éviter cela, il est possible d'utiliser le caractère "retour à la ligne" ''\n''. Dans ce cours, les performances ne sont pas critiques, l'utilisation de ''std::endl'' sera privilégiée.
  
-Pour lire les données, vous pouvez créer un flux de type ''std::ifstream'' et utiliser l'opérateur ''>>''.+L’écriture sur un flux suit donc la forme générale suivante, pour envoyer une ou plusieurs valeurs. 
 + 
 +<code> 
 +FLUX << DATA; 
 +FLUX << DATA << DATA << DATA << DATA ... 
 +</code> 
 + 
 +Pour lire un flux, vous avez déjà également vu que la forme générale est la suivante : 
 +<code> 
 +FLUX >> DATA; 
 +FLUX >> DATA >> DATA >> DATA >> DATA ... 
 +</code> 
 + 
 +Une différence importante entre un flux en lecture et un flux en écriture est qu'il est pas possible de lire des données vers une littérale (une littérale est toujours une valeur constante). 
 + 
 +<code cpp> 
 +int x { 123 }; 
 +file << x;    // ok 
 +file >> x;    // ok 
 + 
 +file << 123;  // ok 
 +file >> 123;  // erreur 
 +</code> 
 + 
 +Pour lire les données depuis un fichier, vous pouvez donc créer un flux de type ''std::ifstream'' et utiliser l'opérateur ''>>''.
  
 <code cpp main.cpp> <code cpp main.cpp>
Ligne 145: Ligne 168:
  
 int main() { int main() {
-    std::ifstream file("test.txt");+    std::ifstream file "test.txt" };
     std::string s {};     std::string s {};
     file >> s;     file >> s;
Ligne 154: Ligne 177:
 <note>Sur Coliru.com, à chaque fois que vous compiler un programme, l'espace de travail est nettoyé. Cela signifie que si vous écrivez un premier code utilisant ''std::ofstream'' pour créer un fichier, que vous l'exécutez, puis que vous créer un nouveau code utilisant ''std::ifstream'' pour lire le fichier créé, ce dernier ne sera plus disponible. <note>Sur Coliru.com, à chaque fois que vous compiler un programme, l'espace de travail est nettoyé. Cela signifie que si vous écrivez un premier code utilisant ''std::ofstream'' pour créer un fichier, que vous l'exécutez, puis que vous créer un nouveau code utilisant ''std::ifstream'' pour lire le fichier créé, ce dernier ne sera plus disponible.
  
-Pour tester l'utilisation des fichiers sur Coliru.com, il est donc préférable d'écrire et lire un fichier dans un même programme.</note>+Pour tester l'utilisation des fichiers sur Coliru.com, il est donc préférable d'écrire et lire un fichier dans un même programme. Dans la suite de ce cours, les codes d'exemples seront généralement écrit pour être exécuté sur Coliru.com, ce qui signifie que les codes contiendront une première série de ligne pour créer un fichier, puis les lignes de code pour lire ce fichier.</note> 
 + 
 +<code cpp main.cpp> 
 +#include <iostream> 
 +#include <fstream> 
 + 
 +int main() { 
 +    {   // creation du fichier 
 +        std::ofstream out { "test.txt" }; 
 +        out << 123 << std::endl; 
 +    } 
 +     
 +    std::ifstream in { "test.txt" }; 
 +    int i {}; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +     
 +    return 0; 
 +
 +</code> 
 + 
 +affiche : 
 + 
 +<code> 
 +123 
 +</code> 
 + 
 + 
 +===== Ecrire plusieurs valeurs, espaces et retours a la ligne ===== 
 + 
 +Comme pour les autres flux en lecture, il est possible de lire plusieurs données dans un flux ''ifstream'' (Heureusement ! L’intérêt des fichiers seraient limité si il n’était possible d’écrire qu'une seule valeur par fichier). 
 + 
 +==== Avec des nombres entiers ==== 
 + 
 +Si vous ajoutez plusieurs valeurs dans le code précédent, vous écrirez probablement le code suivant : 
 + 
 +<code cpp main.cpp> 
 +#include <iostream> 
 +#include <fstream> 
 + 
 +int main() { 
 +    {   // creation du fichier 
 +        std::ofstream out { "test.txt" }; 
 +        out << 123 << 456 << 789 << std::endl; 
 +    } 
 +     
 +    std::ifstream in { "test.txt" }; 
 +    int i {}; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +     
 +    return 0; 
 +
 +</code> 
 + 
 +Malheureusement, ce code n'affiche pas trois valeurs, comme vous pouvez vous y attendre, mais une seule valeur. 
 + 
 +<code> 
 +123456789 
 +</code> 
 + 
 +Si vous utiliser la commande ''cat'' pour voir le contenu du fichier, vous voyez qu'il contient également qu'un seule valeur. Et bien sur, lors de la lecture d'un tel fichier, il n'est pas possible de savoir que vous avez écrit trois valeurs de trois chiffres, ou neuf valeurs de un chiffre, ou encore une valeur de neuf chiffres. 
 + 
 +Modifiez le code pour ajouter un retour a la ligne ou un espace entre deux valeurs. 
 + 
 +<code cpp main.cpp> 
 +#include <iostream> 
 +#include <fstream> 
 + 
 +int main() { 
 +    {   // creation du fichier 
 +        std::ofstream out { "test.txt" }; 
 +        out << 123 << ' ' << 456 << std::endl; 
 +        out << 789 << std::endl; 
 +    } 
 +     
 +    std::ifstream in { "test.txt" }; 
 +    int i {}; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +     
 +    return 0; 
 +
 +</code> 
 + 
 +Maintenant, la commande ''cat'' indique que le fichier contient le texte suivant (ce qui correspond a ce que vous pouviez vous attendre) : 
 + 
 +<code> 
 +123 456 
 +789 
 +</code> 
 + 
 +Le programme affiche : 
 + 
 +<code> 
 +123 
 +456 
 +789 
 +</code> 
 + 
 +Donc, dans ce code, la lecture du fichier est correcte et chaque valeur est lue individuellement. Les espaces et les retours a la ligne sont reconnus comme des séparateurs de valeurs et ''ifstream'' lit correctement le fichier. 
 + 
 +==== Avec des nombres réels ==== 
 + 
 +Les flux permettent également d'utiliser des nombres réels et reconnaissent l’écriture scientifique. 
 + 
 +<code cpp main.cpp> 
 +#include <iostream> 
 +#include <fstream> 
 + 
 +int main() { 
 +    {   // creation du fichier 
 +        std::ofstream out { "test.txt" }; 
 +        out << 123.4546 << std::endl; 
 +        out << 123.456e78 << std::endl; 
 +    } 
 +     
 +    std::ifstream in { "test.txt" }; 
 +    double x {}; 
 +    in >> x; 
 +    std::cout << x << std::endl; 
 +    in >> x; 
 +    std::cout << x << std::endl; 
 +     
 +    return 0; 
 +
 +</code> 
 + 
 +affiche : 
 + 
 +<code> 
 +123.455 
 +1.23456e+80 
 +</code> 
 + 
 +Vous voyez ici que la seconde valeur n'utilise pas le même format d'affichage que celui utilisée dans le code (et dans le fichier). La raison est que les valeurs n'ont pas de format d'affichage a proprement parlé. Ce sont les flux qui affichent les valeurs réelles en utilisant un format (que vous pouvez modifier, pour rappel, voir [[nombres_reels|]]). 
 + 
 +Donc la littérale "123.456e78" dans le code est convertie en une valeur qui ne possède pas de format lorsque le code est compilé. Puis l’écriture de cette valeur dans un fichier utilise le format par défaut de ''std::ofstream''. Cette valeur formatée dans le fichier est ensuite lue par ''std::ifstream'' (qui reconnait ce format) et est enregistrée dans la variable ''x'' sans son format. Et pour terminer, le flux ''std::cout'' affiche la valeur en utilisant son propre format par défaut. 
 + 
 +L'alternance d’étapes qui ne conservent pas le format et de flux qui possèdent leur propre format par défaut explique que la valeur dans le code n'a pas le même format que la valeur affichée au final. Dans la majorité des cas, ce comportement par défaut convient et facilite les lectures et écritures de données. 
 + 
 +En cas de probleme de lecture, n’hésitez pas a vérifier les formats utilisés en lecture et écriture. 
 + 
 +Il faut egalement faire attention a ne pas melanger les nombres entiers et reels. Si vous essayez de lire un fichier contenant une valeur reelle pour l'enregistrer dans une variable entiere, le comportement sera indetermine. 
 + 
 +<code cpp main.cpp> 
 +#include <iostream> 
 +#include <fstream> 
 + 
 +int main() { 
 +    {   // creation du fichier 
 +        std::ofstream out { "test.txt" }; 
 +        out << 123.456e78 << std::endl; 
 +    } 
 +     
 +    std::ifstream in { "test.txt" }; 
 +    int i {}; 
 +    in >> i; 
 +    std::cout << i << std::endl; 
 +     
 +    return 0; 
 +
 +</code> 
 + 
 +affiche : 
 + 
 +<code> 
 +
 +</code> 
 + 
 +L'inverse ne pose pas de probleme, un nombre entier est une forme particuliere de nombre reel (pour lequel la partie decimale est nulle). 
 + 
 + 
 +==== Avec des chaines de caractères ==== 
 + 
 + 
 + 
 + 
 + 
 +probleme avec les espaces. Utilisation de getline 
 + 
 + 
 + 
  
  
Ligne 233: Ligne 447:
 ===== Ecriture et lecture ===== ===== Ecriture et lecture =====
  
-En utilisant les opérateurs de flux ''<<'' pour l'écriture et ''>>'' pour la lecture. (attention a ce que le fichier soit ouvert avec le "bon" mode). 
- 
-Par exemple, pour écrire une liste de valeur, séparé par un espace : 
- 
-<code cpp> 
-file << i << ' ' << j << ' ' << k << endl; 
-</code> 
- 
-Remarque : avec mode texte, les chiffres sont écrit les uns à la suite des autres. Si on écrit : 
- 
-<code cpp> 
-file << 1; 
-file << 2; 
-file << 3; 
-</code> 
- 
-cela produit dans le fichier "123". Si on essaie de lire, on lira qu'un seul nombre (123). Donc penser à ajouter des séparateurs. 
- 
-Pour la lecture : 
- 
-<code> 
-file >> i; 
-</code> 
  
 Problème de séparation des caractères. De lecture d'une ligne Problème de séparation des caractères. De lecture d'une ligne
fichier.1462490018.txt.gz · Dernière modification: 2016/05/06 01:13 par gbdivers