Gestion des fichiers en C++
La gestion des fichiers signifie lire et écrire dans des fichiers (comme .txt, .csv, etc.) à l'aide des classes fournies par la bibliothèque standard C++.
- Les programmes s'exécutent dans la RAM, ce qui signifie que les données n'existent que pendant l'exécution du programme. Lorsqu'un programme se termine, toutes les données de la RAM sont automatiquement perdues.
- La gestion des fichiers permet de stocker les données dans la mémoire secondaire (comme le disque dur ou le SSD) afin qu'elles puissent être conservées de manière permanente et puissent être enregistrées et consultées même après la fin du programme.
- Pour les opérations sur les fichiers, C++ fournit des classes de flux de fichiers dans le
en-tête tel que ofstream ifstream fstream.
Ouvrir un fichier
Avant de lire ou d'écrire dans un fichier, nous devons d'abord l'ouvrir. L'ouverture d'un fichier charge ce fichier dans la RAM. En C++, nous ouvrons un fichier en créant un flux à l'aide du fstream classe qui représente le flux de fichier, c’est-à-dire le flux pour l’entrée et la sortie du fichier.
C++ fstream str ( 'filename.ext' mode );
où
- str : Nom donné au flux
- nom de fichier: Nom du fichier
- mode : Représente la manière dont nous allons interagir avec le fichier.
Modes d'ouverture de fichiers
Le mode d'ouverture du fichier indique que le fichier est ouvert pour la lecture, l'écriture ou l'ajout. Vous trouverez ci-dessous la liste de tous les modes de fichiers en C++ :
| Mode | Description |
|---|---|
| ios ::dans | Fichier ouvert en lecture. Si le fichier n'existe pas, l'opération d'ouverture échoue. |
| ios :: sortie | Fichier ouvert en écriture : le tampon de flux interne prend en charge les opérations de sortie. |
| ios :: binaire | Les opérations sont effectuées en mode binaire plutôt qu'en mode texte. |
| ios :: mangé | La position de sortie commence à la fin du fichier. |
| ios :: application | Toutes les opérations de sortie ont lieu à la fin du fichier en s'ajoutant à son contenu existant. |
| ios :: tronc | Tout contenu qui existait dans le fichier avant son ouverture est supprimé. |
Par exemple si nous voulons ouvrir le fichier en lecture, nous utilisons le mode d'ouverture suivant :
C++ fstream filein ( 'file.txt' ios :: in );
De même, si nous voulons ouvrir le fichier en écriture, nous utilisons ce qui suit :
C++ fstream fileout ( 'file.txt' ios :: out );
Ces modes peuvent également être combinés à l'aide de l'opérateur OR (|). Par exemple, vous pouvez ouvrir le flux de fichiers en mode lecture et écriture, comme indiqué :
C++ fstream str ( 'file.txt' ios :: in | ios :: out );
Si le fichier ouvert en écriture n'existe pas, un nouveau fichier est créé. Mais si le fichier ouvert en mode lecture n'existe pas alors aucun nouveau fichier n'est créé et une exception est levée
Autres flux de fichiers
fstream n'est pas le seul flux de fichiers fourni par C++. Il existe deux filières plus spécialisées :
- ifstream : représente le flux de fichier d'entrée. Cela équivaut à ouvrir fstream dans ios ::dans mode.
- de flux : représente le flux de fichier de sortie. Cela équivaut à ouvrir fstream dans ios :: sortie mode.
Les modes ci-dessus sont les modes par défaut pour ces flux. Ces modes ne peuvent pas être modifiés mais peuvent être associés à d’autres modes. Maintenant, pour la saisie, nous pouvons également utiliser ifstream comme indiqué :
C++ ifstream filein ( 'file.txt' );
De même pour la sortie :
C++ ofstream fileout ( 'file.txt' );
Écrire des données dans un fichier
Une fois le fichier ouvert en mode écriture en utilisant soit fstream ou de flux nous pouvons effectuer l'opération d'écriture de la même manière qu'avec cout en utilisant < < operator.
C++ #include using namespace std ; int main () { // Open a file ofstream file ( 'GFG.txt' ); // Write the string to the file file < < 'Welcome to GeeksforGeeks.' ; return 0 ; }
GFG.texte Lire les données d'un fichier
Une fois le fichier ouvert en mode lecture en utilisant fstream ou ifstream, nous pouvons effectuer l'opération d'écriture de la même manière qu'avec cin en utilisant >> opérateur.
C++ #include using namespace std ; int main () { // Open a file in read mode ifstream file ( 'GFG.txt' ); string s ; // Read string from the file file >> s ; cout < < 'Read String: ' < < s ; return 0 ; }
Sortir
Read String: WelcomeCela a le même problème que cin. L'entrée n'est prise que jusqu'au premier caractère d'espacement. Pour éviter cela, nous pouvons utiliser le obtenir la ligne() Fonctionne comme indiqué :
C++#includeusing namespace std ; int main () { // Open a file in read mode ifstream file ( 'GFG.txt' ); string s ; // Read string from the file getline ( file s ); cout < < 'Read String: ' < < s ; return 0 ; }
SortirRead String: Welcome to GeeksforGeeks.Fermeture du fichier
Fermer le fichier signifie fermer le flux associé et libérer les ressources que nous utilisons. Il est important de fermer le fichier une fois que vous avez terminé, en particulier dans les programmes à exécution longue, pour éviter les fuites de mémoire, les pertes de données, etc.
En C++, les fichiers sont fermés à l'aide du fermer() fonction membre présente dans tous les flux de fichiers.
C++#includeusing namespace std ; int main () { // Open a file in read mode ifstream file ( 'GFG.txt' ); string s ; // Read string from the file getline ( file s ); cout < < 'Read String: ' < < s ; // Close the file file . close (); return 0 ; }
SortirRead String: Welcome to GeeksforGeeks.Erreurs dans la gestion des fichiers
De nombreux types d'erreurs peuvent survenir lors de la gestion des fichiers, par exemple un fichier introuvable, un disque plein, etc. Nos programmes doivent s'attendre à des erreurs courantes et doivent être capables de les gérer correctement. Voici quelques erreurs courantes pouvant survenir lors de la gestion des fichiers :
Échec d'ouverture de fichier
Il peut y avoir des cas dans lesquels le fichier n'est pas ouvert pour diverses raisons telles qu'il n'existe pas ou que le programme n'est pas autorisé à l'ouvrir, etc. Dans ce cas, nous pouvons utiliser le est_ouvert() fonction membre des classes de flux de fichiers pour vérifier si le fichier est ouvert avec succès ou non.
C++#includeusing namespace std ; int main () { fstream file ( 'nonexistent_file.txt' ios :: in ); // Check if the file is opened if ( ! file . is_open ()) { cerr < < 'Error: Unable to open file!' < < endl ; return 1 ; } file . close (); return 0 ; }
SortirError: Unable to open file!Échec de lecture/écriture de données
Une autre erreur courante est l'échec de la lecture ou de l'écriture des données pour des raisons telles qu'un mode incorrect, etc. Dans ce cas, nous pouvons valider les opérations après chaque tentative de lecture/écriture. Par exemple, la lecture à l'aide de getline() peut être validée comme indiqué :
C++#includeusing namespace std ; int main () { fstream file ( 'GFG.txt' ios :: out ); if ( ! file . is_open ()) { cerr < < 'Error: Unable to open file!' < < endl ; return 1 ; } string line ; // Checking if getline() read successfully or not if ( ! getline ( file line )) cerr < < 'Error: Failed to read data' < < endl ; file . close (); return 0 ; }
SortirError: Failed to read dataErreur de fin de fichier (EOF)
Essayer de lire au-delà de la fin du fichier peut provoquer une erreur EOF. Cela peut arriver lorsque vous ne vérifiez pas la fin du fichier avant de le lire. Nous pouvons vérifier EOF en utilisant eof() fonction membre.
C++#includeusing namespace std ; int main () { ifstream file ( 'GFG.txt' ); if ( ! file . is_open ()) { cerr < < 'Error: Unable to open file!' < < endl ; return 1 ; } string line ; while ( getline ( file line )) cout < < line < < endl ; // Check for eof if ( file . eof ()) cout < < 'Reached end of file.' < < endl ; else cerr < < 'Error: File reading failed!' < < endl ; file . close (); return 0 ; }
SortirReached end of file.Notez que nous avons également validé l'opération de lecture avant de vérifier EOF comme obtenir la ligne() je reviendrai seulement nullptr même si la lecture échoue pour une raison quelconque.
Gestion des fichiers binaires
En C++, nous pouvons également gérer fichiers binaires qui stockent les données au format brut. Pour lire et écrire des données binaires, il faut utiliser le ios :: binaire drapeau lors de la création/ouverture d’un fichier binaire.
Écrire dans un fichier binaire
Pour écrire des données dans un fichier binaire, nous devons d'abord ouvrir ou créer le fichier dans ios :: binaire mode.
C++#include#include #include using namespace std ; int main () { string str = 'Welcome to GeeksForGeeks' ; // Open a binary file for writing ofstream file ( 'fileBin.bin' ios :: binary ); // Check if the file is open if ( ! file ) { cerr < < 'Error opening the file for writing.' ; return 1 ; } // Write the length of the string (size) to file first size_t strLength = str . length (); file . write ( reinterpret_cast < const char *> ( & strLength ) sizeof ( strLength )); // Write the string to the binary file file . write ( str . c_str () strLength ); // Close the file file . close (); return 0 ; }
SortirFichier binaire
Lecture à partir d'un fichier binaire
Tout comme nous ouvrons un fichier en mode binaire pour écrire des données pour lire les données d'un fichier binaire, nous devons ouvrir le fichier en mode lecture en utilisant ios ::dans .
Syntaxe:
C++C++fstream fileInstance ( 'fileName.bin' ios :: in | ios :: binary );#include#include #include using namespace std ; int main () { string str ; // Open the binary file for reading fstream file ( 'fileBin.bin' ios :: in | ios :: binary ); // Check if the file is open if ( ! file ) { cerr < < 'Error opening the file for reading.' ; return 1 ; } // Read the length of the string (size) from the file size_t strLength ; file . read ( reinterpret_cast < char *> ( & strLength ) sizeof ( strLength )); // Allocate memory for the string and read the data char * buffer = new char [ strLength + 1 ]; // +1 for the null-terminator file . read ( buffer strLength ); // Null-terminate the string buffer [ strLength ] = ' ' ; // Convert the buffer to a string str = buffer ; // Print file data cout < < 'File Data: ' < < str ; delete [] buffer ; file . close (); return 0 ; }
SortirFile Data: Welcome to GeeksForGeeksAutres opérations sur les fichiers
Nous pouvons également effectuer plus d'opérations pour manipuler un fichier à partir de notre programme C++. Certaines des opérations courantes sur les fichiers sont :
Créer un quiz
- Programme C++ pour supprimer un fichier
- Ajouter une chaîne dans un fichier existant
- Copier un fichier dans un autre fichier
Fichier binaire