Gestionarea fișierelor în C++
Gestionarea fișierelor înseamnă citirea și scrierea în fișiere (cum ar fi .txt .csv etc.) folosind clasele furnizate de biblioteca standard C++.
- Programele rulează în RAM, ceea ce înseamnă că datele există numai în timp ce programul rulează, când un program se termină, toate datele din RAM se pierd automat.
- Gestionarea fișierelor permite stocarea datelor în memoria secundară (cum ar fi HDD sau SSD), astfel încât acestea să poată fi păstrate permanent și să poată fi salvate și accesate chiar și după terminarea programului.
- Pentru operațiuni cu fișiere, C++ oferă clase de flux de fișiere în
antet, cum ar fi ofstream ifstream fstream.
Deschiderea unui fișier
Înainte de a citi sau de a scrie într-un fișier, trebuie mai întâi să îl deschidem. Deschiderea unui fișier încarcă acel fișier în RAM. În C++ deschidem un fișier prin crearea unui flux către acesta folosind fstream clasă care reprezintă fluxul de fișiere, adică fluxul pentru intrare și ieșire în fișier.
C++ fstream str ( 'filename.ext' mode );
unde
- str: Numele dat fluxului
- nume de fișier: Numele fișierului
- modul : Reprezintă modul în care vom interacționa cu fișierul.
Moduri de deschidere a fișierelor
Modul de deschidere a fișierului indică faptul că fișierul este deschis pentru citire, scriere sau adăugare. Mai jos este lista tuturor modurilor de fișiere în C++:
| Modul | Descriere |
|---|---|
| ios::in | Fișier deschis pentru citire. Dacă fișierul nu există, operația de deschidere eșuează. |
| ios::out | Fișier deschis pentru scriere: tamponul de flux intern acceptă operațiuni de ieșire. |
| ios::binar | Operațiile sunt efectuate mai degrabă în modul binar decât în text. |
| ios::ate | Poziția de ieșire începe la sfârșitul fișierului. |
| ios::app | Toate operațiunile de ieșire au loc la sfârșitul fișierului atașat la conținutul său existent. |
| ios::trunchi | Orice conținut care a existat în fișier înainte de a fi deschis este eliminat. |
De exemplu dacă dorim să deschidem fișierul pentru citire, folosim următorul mod de deschidere:
C++ fstream filein ( 'file.txt' ios :: in );
În mod similar, dacă vrem să deschidem fișierul pentru scriere, folosim următoarele:
C++ fstream fileout ( 'file.txt' ios :: out );
Aceste moduri pot fi, de asemenea, combinate folosind operatorul SAU (|). De exemplu, puteți deschide fluxul de fișiere atât în modul de citire, cât și în modul de scriere, după cum se arată:
C++ fstream str ( 'file.txt' ios :: in | ios :: out );
Dacă fișierul deschis în modul de scriere nu există, se creează un fișier nou. Dar dacă fișierul deschis în modul de citire nu există, atunci nu este creat niciun fișier nou și se aruncă o excepție
Alte fluxuri de fișiere
fstream nu este singurul flux de fișiere furnizat de C++. Mai există două fluxuri specializate:
- ifstream : reprezintă fluxul de fișiere de intrare. Este echivalent cu deschiderea fstream în ios::in modul.
- ofstream : reprezintă fluxul de fișiere de ieșire. Este echivalent cu deschiderea fstream în ios::out modul.
Modurile de mai sus sunt moduri implicite pentru aceste fluxuri. Aceste moduri nu pot fi schimbate, dar pot fi asociate cu alte moduri. Acum, pentru intrare, putem folosi și ifstream așa cum se arată:
C++ ifstream filein ( 'file.txt' );
La fel pentru ieșire:
C++ ofstream fileout ( 'file.txt' );
Scrieți datele în fișier
Odată ce fișierul este deschis în modul de scriere folosind oricare fstream sau ofstream putem efectua operația de scriere în mod similar cu utilizarea cout < < 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.text Citiți date din fișier
Odată ce fișierul este deschis în modul citire folosind fie fstream, fie ifstream, putem efectua operația de scriere în mod similar cu cin folosind >> operator.
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 ; }
Ieșire
Read String: WelcomeAceasta are aceeași problemă ca și cin. Introducerea este luată numai până la primul caracter de spațiu alb. Pentru a evita acest lucru putem folosi getline() functioneaza asa cum se arata:
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 ; }
IeșireRead String: Welcome to GeeksforGeeks.Închiderea Fișierului
Închiderea fișierului înseamnă închiderea fluxului asociat și eliberarea resurselor pe care le folosim. Este important să închideți fișierul după ce ați terminat cu el, mai ales în programele care rulează lung pentru a evita pierderile de memorie, pierderea datelor etc.
În C++ fișierele sunt închise folosind aproape() funcția membru care este prezentă în toate fluxurile de fișiere.
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 ; }
IeșireRead String: Welcome to GeeksforGeeks.Erori în manipularea fișierelor
Pot apărea multe tipuri diferite de erori în gestionarea fișierelor, cum ar fi fișierul nu a fost găsit pe disc plin etc. Programele noastre ar trebui să se aștepte la erori comune și ar trebui să le poată gestiona corect. Următoarele sunt câteva erori comune care pot apărea în timpul manipulării fișierelor:
Eșec la deschiderea fișierului
Pot exista cazuri în care fișierul nu este deschis din diverse motive, cum ar fi nu există sau programul nu are permisiunea de a-l deschide etc. În acest caz, putem folosi este_deschis() funcția membru al claselor de flux de fișiere pentru a verifica dacă fișierul este deschis cu succes sau nu.
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 ; }
IeșireError: Unable to open file!Eșecul citirii/scrierii datelor
O altă eroare comună este eșecul citirii sau scrierii datelor din motive precum modul incorect etc. În acest caz, putem valida operațiile după fiecare încercare de citire/scriere. De exemplu, citirea folosind getline() poate fi validată după cum arată:
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 ; }
IeșireError: Failed to read dataEroare la sfârșitul fișierului (EOF).
Încercarea de a citi dincolo de sfârșitul fișierului poate provoca o eroare EOF. Acest lucru se poate întâmpla atunci când nu verificați sfârșitul fișierului înainte de a citi. Putem verifica EOF folosind eof() funcția de membru.
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 ; }
IeșireReached end of file.Observați că am validat și operația de citire înainte de a verifica EOF ca getline() se va întoarce doar nullptr chiar dacă citirea eșuează din orice motiv.
Gestionarea fișierelor binare
În C++ ne putem descurca și fișiere binare care stochează date în format brut. Pentru a citi și scrie date binare trebuie să utilizați ios::binar flag la crearea/deschiderea unui fișier binar.
Scrieți în fișierul binar
Pentru a scrie date într-un fișier binar, trebuie mai întâi să deschidem sau să creăm fișierul în ios::binar modul.
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 ; }
IeșireFișier binar
Citirea din fișierul binar
Așa cum deschidem un fișier în modul binar pentru a scrie date pentru a citi date dintr-un fișier binar, trebuie să deschidem fișierul în modul de citire folosind ios::in .
Sintaxă:
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 ; }
IeșireFile Data: Welcome to GeeksForGeeksAlte operațiuni cu fișiere
De asemenea, putem face mai multe operațiuni pentru a manipula un fișier din programul nostru C++. unele dintre operațiunile comune cu fișierele sunt:
Creați un test
- Program C++ pentru a șterge un fișier
- Adăugați un șir într-un fișier existent
- Copiați un fișier într-un alt fișier
Fișier binar