FREOPEN |
Libère et ouvre |
---|---|
Langage C++ | cstdio (stdio.h) |
Syntaxe
FILE *freopen(const char *nomfichier,const char *mode,FILE *ptrfichier) |
Paramètres
Nom | Description | |
---|---|---|
nomfichier | Ce paramètre permet d'indiquer le nom du fichier | |
mode | Ce paramètre permet d'indiquer le mode d'ouverture, pouvant être combiné, du fichier : | |
Valeur | Description | |
a | Cette valeur indique une création en ajoutant à la fin du fichier | |
b | Cette valeur indique une ouverture en mode binaire | |
a+ | Cette valeur indique une création en ajoutant à la fin du fichier existant | |
r | Cette valeur indique un mode d'accès en lecture | |
r+ | Cette valeur indique un mode d'accès en lecture d'un fichier existant | |
t | Cette valeur indique une ouverture en mode texte | |
w | Cette valeur indique un mode d'accès en écriture | |
w+ | Cette valeur indique un mode d'accès en écriture et écrase le fichier existant | |
ptrfichier | Ce paramètre permet d'indiquer l'identificateur de fichier |
Description
Cette fonction permet de fermer le fichier et de réouvrer un fichier en lui affectant un pointeur.
Remarques
- La fonction freopen() associe un flux de données existant à un fichier différent. Le nom du nouveau fichier est pointé par nomfichier, le mode d'accès est pointé par mode et le flux de données à réaffecter est pointé par ptrfichier. La chaîne de caractères de mode utilise le même format que la fonction fopen().
- Lorsqu'elle est appelé, la fonction freopen() essaie d'abord de fermer un fichier pouvant actuellement être associé à un flux de données. Cependant, si la tentative de fermeture du fichier échoue, la fonction freopen() continue toujours d'ouvrir l'autre fichier.
- La fonction freopen() renvoie un pointeur à diffuser en cas de succès et un pointeur null dans le cas contraire.
- L'utilisation principale de la fonction freopen() est de rediriger les fichiers définis par le système stdin (entrée standard), stdout (sortie standard) et stderr (sortie d'erreur standard) vers un autre fichier.
- Redirection des flux standards et des fichiers : La fonction freopen permet de réouvrir un fichier existant en modifiant l'association d'un flux (stdin, stdout, stderr ou un fichier ouvert avec fopen). Cela est utile pour rediriger l'entrée ou la sortie d'un programme, par exemple pour enregistrer des journaux de bord ou lire des entrées depuis un fichier plutôt que le clavier.
- Utilisation pour rediriger stdout vers un fichier : freopen est souvent utilisée pour rediriger stdout vers un fichier, permettant d'écrire les sorties du programme dans un fichier au lieu de l'écran :
- Redirection de stdin pour lire depuis un fichier : On peut aussi rediriger stdin pour lire des entrées depuis un fichier au lieu du clavier :
- Impact sur les flux standards (cout et cerr en C++) : freopen ne redirige pas automatiquement les flux C++ std::cout, std::cin et std::cerr. Pour rediriger ces flux, il faut utiliser la fonction std::ios::rdbuf() comme ceci :
- std::ofstream file("output.txt");
- std::streambuf *backup = std::cout.rdbuf(file.rdbuf());
- std::cout << "Ceci sera écrit dans output.txt" << std::endl;
- std::cout.rdbuf(backup); // Rétablir la sortie par défaut
- Fermeture automatique du flux d'origine : Lorsqu'un fichier est réouvert avec freopen, l'ancien fichier associé au FILE* est automatiquement fermé. Il n'est donc pas nécessaire d'appeler fclose sur le fichier d'origine avant d'utiliser freopen, ce qui simplifie la gestion des fichiers dans certains cas.
- Gestion des erreurs et vérification du retour : freopen peut échouer si le fichier n'existe pas ("r"), si le programme n'a pas les permissions nécessaires ou si le mode d'ouverture est invalide. Il est donc essentiel de vérifier le retour de la fonction :
- Portabilité et alternatives : freopen est une fonction standard du C, mais son comportement peut varier légèrement selon les plateformes, notamment sous Windows et Linux. Une alternative en C++ est d'utiliser std::ofstream pour stdout et std::ifstream pour stdin, ce qui offre une meilleure portabilité et une intégration plus propre avec les flux C++.
Après cet appel, toutes les sorties utilisant printf ou cout seront envoyées au fichier output.txt.
Cela est utile pour automatiser les tests d'un programme avec des fichiers d'entrée prédéfinis.
Cela permet de rediriger la sortie de std::cout tout en gardant la possibilité de la restaurer.
Cela permet d'éviter des comportements indéfinis si la redirection échoue.
Exemple
Voici un exemple montrant une utilisation plus classique de cette fonction :

- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
-
- int main()
- {
- FILE * Handle = fopen("monfichier.txt", "w+");
- if(Handle != NULL) {
- FILE * Handle2;
- fprintf(Handle,"Gladir.com");
- std::cout << "Le fichier a été écrit avec succès" << std::endl;
- Handle2 = freopen("monfichier.txt", "w+", Handle);
- if(Handle != NULL) {
- fprintf(Handle2,"Gladir.ca");
- std::cout << "Le fichier a été réouvert avec succès" << std::endl;
- /* Traitement ... */
- fclose(Handle);
- }
- }
- return 0;
- }
on obtiendra le résultat suivant dans le fichier «monfichier.txt» :
Gladir.caVoir également
Langage de programmation - C++ - Référence de procédures et fonctions - fclose
Langage de programmation - C++ - Référence de procédures et fonctions - fopen
Langage de programmation - C - Référence de procédures et fonctions - freopen
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 731.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 112.