Rukovanje datotekama u C++
Rukovanje datotekama znači čitanje i pisanje u datoteke (kao što su .txt .csv itd.) korištenjem klasa koje pruža C++ standardna biblioteka.
- Programi se pokreću u RAM-u što znači da podaci postoje samo dok je program pokrenut kada program završi, svi podaci u RAM-u se automatski gube.
- Rukovanje datotekama omogućuje pohranjivanje podataka u sekundarnu memoriju (poput HDD-a ili SSD-a) tako da se mogu trajno sačuvati te da im se može spremati i pristupati im se čak i nakon završetka programa.
- Za operacije s datotekama C++ nudi klase toka datoteka u
zaglavlje kao što je ofstream ifstream fstream.
Otvaranje datoteke
Prije čitanja ili pisanja u datoteku prvo je moramo otvoriti. Otvaranje datoteke učitava tu datoteku u RAM. U C++ datoteku otvaramo stvaranjem streama za nju pomoću fstream klasa koja predstavlja tok datoteke tj. tok za ulaz i izlaz u datoteku.
C++ fstream str ( 'filename.ext' mode );
gdje
- str: Naziv dodijeljen toku
- naziv datoteke: Naziv datoteke
- način rada : Predstavlja način na koji ćemo komunicirati s datotekom.
Načini otvaranja datoteka
Način otvaranja datoteke pokazuje da je datoteka otvorena za čitanje, pisanje ili dodavanje. Ispod je popis svih modova datoteka u C++:
| Način rada | Opis |
|---|---|
| ios::in | Datoteka otvorena za čitanje. Ako datoteka ne postoji, operacija otvaranja ne uspijeva. |
| ios::out | Datoteka otvorena za pisanje: međuspremnik unutarnjeg toka podržava izlazne operacije. |
| ios::binarni | Operacije se izvode u binarnom načinu, a ne tekstu. |
| ios::jesti | Izlazna pozicija počinje na kraju datoteke. |
| ios::aplikacija | Sve izlazne operacije događaju se na kraju datoteke dodajući njenom postojećem sadržaju. |
| ios::trunk | Sav sadržaj koji je postojao u datoteci prije otvaranja se odbacuje. |
Na primjer ako želimo otvoriti datoteku za čitanje koristimo sljedeći način otvaranja:
C++ fstream filein ( 'file.txt' ios :: in );
Slično, ako želimo otvoriti datoteku za pisanje koristimo sljedeće:
C++ fstream fileout ( 'file.txt' ios :: out );
Ovi se načini također mogu kombinirati korištenjem OR operatora (|). Na primjer, možete otvoriti tok datoteke u načinu čitanja i pisanja kao što je prikazano:
C++ fstream str ( 'file.txt' ios :: in | ios :: out );
Ako datoteka otvorena u načinu pisanja ne postoji, stvara se nova datoteka. Ali ako datoteka otvorena u načinu čitanja ne postoji, tada se ne stvara nova datoteka i izbacuje se iznimka
Ostali tokovi datoteka
fstream nije jedini tok datoteka koji omogućuje C++. Postoje još dva specijalizirana toka:
- ifstream : Označava tok ulazne datoteke. To je ekvivalentno otvaranju fstreama u ios::in način rada.
- ofstream : Označava tok izlazne datoteke. To je ekvivalentno otvaranju fstreama u ios::out način rada.
Gore navedeni načini su zadani načini za ove streamove. Ovi načini se ne mogu mijenjati, ali se mogu spojiti zajedno s drugim načinima. Sada za unos također možemo koristiti ifstream kao što je prikazano:
C++ ifstream filein ( 'file.txt' );
Slično za izlaz:
C++ ofstream fileout ( 'file.txt' );
Zapišite podatke u datoteku
Nakon što se datoteka otvori u načinu pisanja pomoću bilo kojeg fstream ili ofstream možemo izvesti operaciju pisanja na sličan način kao s cout koristeći < < 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.tekst Čitaj podatke iz datoteke
Nakon što se datoteka otvori u načinu čitanja pomoću fstreama ili ifstreama, možemo izvesti operaciju pisanja na sličan način kao s cin koristeći >> 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 ; }
Izlaz
Read String: WelcomeOvo ima isti problem kao i cin. Unos se uzima samo do prvog znaka razmaka. Da bismo to izbjegli, možemo koristiti getline() funkcija kao što 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 ; }
IzlazRead String: Welcome to GeeksforGeeks.Zatvaranje datoteke
Zatvaranje datoteke znači zatvaranje pridruženog toka i oslobađanje resursa koje koristimo. Važno je zatvoriti datoteku nakon što završite s njom, posebno u dugotrajnim programima kako biste izbjegli curenje memorije, gubitak podataka itd.
U C++ datoteke se zatvaraju pomoću zatvoriti() funkcija članica koja je prisutna u svim tokovima datoteka.
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 ; }
IzlazRead String: Welcome to GeeksforGeeks.Pogreške u rukovanju datotekama
Mnogo različitih vrsta pogrešaka može se pojaviti u rukovanju datotekama, kao što je datoteka nije pronađena, disk je pun itd. Naši programi bi trebali očekivati uobičajene pogreške i trebali bi biti u mogućnosti ispravno ih obraditi. Slijede neke uobičajene pogreške koje se mogu pojaviti tijekom rukovanja datotekama:
Otvaranje datoteke nije uspjelo
Mogu postojati slučajevi u kojima se datoteka ne otvori zbog raznih razloga kao što je ne postoji ili program nema dopuštenje za otvaranje itd. U ovom slučaju možemo koristiti je_otvoreno() funkcija člana klasa toka datoteka za provjeru je li datoteka otvorena uspješno ili 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 ; }
IzlazError: Unable to open file!Neuspješno čitanje/pisanje podataka
Još jedna uobičajena pogreška je neuspjeh čitanja ili pisanja podataka iz razloga kao što je netočan način itd. U ovom slučaju možemo potvrditi operacije nakon svakog pokušaja čitanja/pisanja. Na primjer, čitanje pomoću getline() može se potvrditi kao što je prikazano:
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 ; }
IzlazError: Failed to read dataPogreška kraja datoteke (EOF).
Pokušaj čitanja nakon kraja datoteke može uzrokovati pogrešku EOF. To se može dogoditi ako ne provjerite kraj datoteke prije čitanja. EOF možemo provjeriti pomoću eof() funkcija člana.
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 ; }
IzlazReached end of file.Primijetite da smo također potvrdili operaciju čitanja prije provjere EOF kao getline() samo će se vratiti nullptr čak i ako čitanje ne uspije iz bilo kojeg razloga.
Rukovanje binarnim datotekama
U C++ također možemo podnijeti binarne datoteke koji pohranjuju podatke u sirovom formatu. Za čitanje i pisanje binarnih podataka morate koristiti ios::binarni zastavica prilikom kreiranja/otvaranja binarne datoteke.
Zapiši u binarnu datoteku
Da bismo upisali podatke u binarnu datoteku, prvo moramo otvoriti ili stvoriti datoteku ios::binarni način rada.
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 ; }
IzlazBinarna datoteka
Čitanje iz binarne datoteke
Baš kao što otvaramo datoteku u binarnom načinu za pisanje podataka za čitanje podataka iz binarne datoteke, moramo otvoriti datoteku u načinu za čitanje pomoću 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 ; }
IzlazFile Data: Welcome to GeeksForGeeksOstale radnje s datotekama
Također možemo napraviti više operacija za manipuliranje datotekom iz našeg C++ programa. neke od uobičajenih operacija datoteka su:
Napravi kviz
- C++ program za brisanje datoteke
- Dodavanje niza u postojeću datoteku
- Kopirajte jednu datoteku u drugu datoteku
Binarna datoteka