Salut,
Pour répondre à ta question:fopen est une fonction issue du C, qui manipule typiquement des File Descriptor caché dans la structure FILE.
Le C++ préfère travailler sur base de flux de données, dont les classes ifstream (i pour input, f pour file ) et ofstream (o pour output, f pour... file itou).
Elles sont créées de manière à fournir une interface commune quelle que soit la donnée à lire (ou à écrire), et fonctionne "naturellement" quel que soit le type primitif utilisé, ainsi que s'il est nécessaire d'écrire des chaines de caractères.
Il est également possible de définir les opérateurs de flux << (pour l'écriture) et >> (pour la lecture) de tes structures de données personnalisées
Il existe un principe nommé RAII (Ressource Acquisition Is Initialisation) qui considère qu'il faut qu'une variable soit correctement initialisée dés le moment où elle est déclarée.
Du point de vue des flux de fichier, cela se traduit par le fait que, dés que l'on en déclare un, il faut être en mesure de lire (ou d'écrire, selon le cas) dans ce fichier.
Le but est, en définitive, de simplifier le plus possible l'utilisation de ces flux
Il existe un certain nombre de possibilités de créer un fichier, dont celle proposée par 3DArchi (qui est celle à préférer aussi souvent que possible), qui nécessite, pour une question purement historique, de fournir le nom du fichier sous la forme d'une chaine de caractères "C style" (un tableau de caractères terminé par un '/0'.
Tu peux donc décider de créer un flux de lecture dans un fichier sous la forme de
1 2
| std::ifstream ifs("mon_fichier.txt");
/* ici vient la lecture du fichier */ |
Mais, cela implique un problème de taille: la lecture ne pourra se faire que... dans mon_fichier.txt...
Si, par la suite, tu décider de créer un autre fichier qui pourrait être lu de manière identique à mon_fichier.txt, tu sera obligé de... recopier exactement le même code pour ce deuxième fichier, ce qui, il faut l'avouer, n'est pas des plus efficaces
L'idée est donc de "factoriser" l'ouverture et la lecutre du fichier dans une fonction, et de fournir à cette fonction le nom du fichier sous la forme d'une chaine de caractères que l'on souhaite ouvrir.
Pour manipuler les chaines de caractères, nous utilisons la classe string, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <string> de préférence à toute autre alternative issue du C (dont les fameuses chaines de caractères C style).
Pour passer une chaine de caractères en paramètre d'une fonction qui ne doit pas modifier la chaine en question, l'idéal reste toujours de la transmettre sous la forme d'une référence constante.
Mais, l'aberration historique aidant, il faudra, uniquement pour permettre d'ouvrir le fichier, convertir cette chaine de caractères de type string en une chaine de caractères C style.
Il se fait qu'il est très facile d'y arriver, car il existe une fonction membre de la classe string prévue à cet effet: la fonction membre c_str().
Tu en arrives donc à une fonction dont la forme sera proche de
1 2 3 4 5 6 7 8 9
| TypeDeRetour lecture(std::string const& filename)
{
/* ouverture du fichier */
std::ifstream ifs(filename.c_str());
/* lecture du fichier
* ...
* retour éventuel
*/
} |
Il sera ensuite assez facile de décider le fichier que tu veux lire en donnant simplement le nom de ce fichier comme argument à la fonction.
Cela peut prendre la forme "simple" de
lecture("mon_fichier.txt");
mais cela peut tout aussi bien prendre une forme plus complexe proche de
1 2 3 4 5 6 7 8 9 10 11 12 13
|
std::string tempname("c:\\");
/*rajoutons le chemin d'acces au fichier */
tempname+="Program Files\\mon application\\ data";
/* créons dix noms de fichiers à lire de manière dynamique */
for (int i = 1;i<=10;++i)
{
/*stringstream est un flux de conversion "bi directionnel" */
std::stringstream ss;
ss<<tempname<<"mon_fichier_"<<i<<".txt";
filename=ss.str();
lecture(filename);
} |
qui aura, selon l'exemple, comme résultat de lire les fichiers nommés resectivement mon_fichier_1.txt, mon_fichier_2.txt,(... tous les autres ...) ,mon_fichier_10.txt qui se trouvent dans c:\Program Files\mon application\data
Partager