Upravljanje datotek v C++
Ravnanje z datotekami pomeni branje in pisanje datotek (kot so .txt .csv itd.) z uporabo razredov, ki jih ponuja standardna knjižnica C++.
- Programi se izvajajo v RAM-u, kar pomeni, da podatki obstajajo samo med izvajanjem programa, ko se program konča, se vsi podatki v RAM-u samodejno izgubijo.
- Ravnanje z datotekami omogoča shranjevanje podatkov v sekundarni pomnilnik (kot je HDD ali SSD), tako da jih je mogoče trajno shraniti in jih je mogoče shraniti in do njih dostopati tudi po zaključku programa.
- Za datotečne operacije C++ ponuja razrede datotečnega toka v
glava, kot je ofstream ifstream fstream.
Odpiranje datoteke
Pred branjem iz datoteke ali pisanjem vanjo jo moramo najprej odpreti. Odpiranje datoteke naloži to datoteko v RAM. V C++ odpremo datoteko tako, da ji ustvarimo tok z uporabo fstream razred, ki predstavlja tok datoteke, tj. tok za vnos in izhod v datoteko.
C++ fstream str ( 'filename.ext' mode );
kjer
- str: Ime, dodeljeno toku
- ime datoteke: Ime datoteke
- način : Predstavlja način, na katerega bomo komunicirali z datoteko.
Načini odpiranja datotek
Način odpiranja datoteke označuje, da je datoteka odprta za branje, pisanje ali dodajanje. Spodaj je seznam vseh datotečnih načinov v C++:
| Način | Opis |
|---|---|
| ios::in | Datoteka odprta za branje. Če datoteka ne obstaja, odpiranje ne uspe. |
| ios::out | Datoteka odprta za pisanje: notranji medpomnilnik toka podpira izhodne operacije. |
| ios::binary | Operacije se izvajajo v binarnem načinu namesto besedila. |
| ios::ate | Izhodni položaj se začne na koncu datoteke. |
| ios::aplikacija | Vse izhodne operacije se zgodijo na koncu datoteke, ki se doda njeni obstoječi vsebini. |
| ios::trunk | Vsa vsebina, ki je obstajala v datoteki, preden je bila odprta, je zavržena. |
Na primer če želimo datoteko odpreti za branje, uporabimo naslednji način odpiranja:
C++ fstream filein ( 'file.txt' ios :: in );
Podobno, če želimo odpreti datoteko za pisanje, uporabimo naslednje:
C++ fstream fileout ( 'file.txt' ios :: out );
Te načine je mogoče kombinirati tudi z uporabo operatorja ALI (|). Datotečni tok lahko na primer odprete v načinu branja in pisanja, kot je prikazano:
C++ fstream str ( 'file.txt' ios :: in | ios :: out );
Če datoteka, odprta v načinu zapisovanja, ne obstaja, se ustvari nova datoteka. Če pa datoteka, odprta v načinu za branje, ne obstaja, se nova datoteka ne ustvari in sproži se izjema
Drugi tokovi datotek
fstream ni edini tok datotek, ki ga ponuja C++. Obstajata še dva specializirana toka:
- ifstream : pomeni tok vhodne datoteke. To je enakovredno odprtju fstream v ios::in način.
- ofstream : pomeni tok izhodne datoteke. To je enakovredno odpiranju fstream v ios::out način.
Zgornji načini so privzeti načini za te tokove. Teh načinov ni mogoče spremeniti, lahko pa jih združite z drugimi načini. Zdaj lahko za vnos uporabimo tudi ifstream, kot je prikazano:
C++ ifstream filein ( 'file.txt' );
Podobno za izhod:
C++ ofstream fileout ( 'file.txt' );
Zapišite podatke v datoteko
Ko je datoteka odprta v načinu pisanja z bodisi fstream oz ofstream lahko izvedemo operacijo pisanja na podoben način kot pri cout z uporabo < < 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 Branje podatkov iz datoteke
Ko je datoteka odprta v načinu branja z uporabo fstream ali ifstream, lahko izvedemo operacijo pisanja na podoben način kot pri cin z uporabo >> operater.
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 ; }
Izhod
Read String: WelcomeTo ima enako težavo kot cin. Vnos se izvaja le do prvega presledka. Da bi se temu izognili, lahko uporabimo getline() funkcija, kot je prikazano:
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 ; }
IzhodRead String: Welcome to GeeksforGeeks.Zapiranje datoteke
Zapiranje datoteke pomeni zapiranje povezanega toka in sprostitev virov, ki jih uporabljamo. Pomembno je, da zaprete datoteko, ko končate z njo, zlasti v dolgo delujočih programih, da preprečite puščanje pomnilnika, izgubo podatkov itd.
V C++ se datoteke zaprejo z uporabo zapri() funkcijo člana, ki je prisotna v vseh tokovih datotek.
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 ; }
IzhodRead String: Welcome to GeeksforGeeks.Napake pri ravnanju z datotekami
Pri ravnanju z datotekami se lahko pojavi veliko različnih vrst napak, na primer datoteka ni najdena, disk je poln itd. Naši programi bi morali pričakovati običajne napake in bi jih morali znati ustrezno obravnavati. Sledi nekaj pogostih napak, do katerih lahko pride med obdelavo datotek:
Napaka pri odpiranju datoteke
Obstajajo lahko primeri, ko se datoteka ne odpre zaradi različnih razlogov, na primer ne obstaja ali program nima dovoljenja za odpiranje itd. V tem primeru lahko uporabimo je_odprto() članska funkcija razredov datotečnega toka za preverjanje, ali je datoteka odprta uspešno ali ne.
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 ; }
IzhodError: Unable to open file!Napaka pri branju/pisanju podatkov
Druga pogosta napaka je neuspešno branje ali pisanje podatkov zaradi razlogov, kot je nepravilen način itd. V tem primeru lahko potrdimo operacije po vsakem poskusu branja/pisanja. Na primer, branje z uporabo getline() je mogoče preveriti, kot kaže:
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 ; }
IzhodError: Failed to read dataNapaka na koncu datoteke (EOF).
Poskus branja po koncu datoteke lahko povzroči napako EOF. To se lahko zgodi, če pred branjem ne preverite konca datoteke. EOF lahko preverimo z uporabo eof() članska funkcija.
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 ; }
IzhodReached end of file.Upoštevajte, da smo tudi potrdili operacijo branja, preden smo preverili EOF kot getline() se bo samo vrnil nullptr tudi če branje iz kakršnega koli razloga ne uspe.
Ravnanje z binarnimi datotekami
V C++ zmoremo tudi binarne datoteke ki shranjujejo podatke v surovi obliki. Za branje in pisanje binarnih podatkov morate uporabiti ios::binary zastavico pri ustvarjanju/odpiranju binarne datoteke.
Zapiši v binarno datoteko
Če želite zapisati podatke v binarno datoteko, jo moramo najprej odpreti ali ustvariti ios::binary način.
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 ; }
IzhodBinarna datoteka
Branje iz binarne datoteke
Tako kot odpremo datoteko v binarnem načinu za pisanje podatkov za branje podatkov iz binarne datoteke, moramo datoteko odpreti v načinu za branje z ios::in .
Sintaksa:
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 ; }
IzhodFile Data: Welcome to GeeksForGeeksDruge operacije datotek
Prav tako lahko izvedemo več operacij za manipulacijo datoteke iz našega programa C++. nekatere običajne operacije datotek so:
Ustvari kviz
- Program C++ za brisanje datoteke
- Dodajanje niza v obstoječo datoteko
- Kopirajte eno datoteko v drugo datoteko
Binarna datoteka