Rukovanje datotekama u C++

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  ;   }   
pisatiGFG.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: Welcome  

Ovo 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++
   #include          using     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  ;   }   


Izlaz

 Read 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++
   #include          using     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  ;   }   


Izlaz

 Read 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++
   #include          using     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  ;   }   


Izlaz

 Error: 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++
   #include          using     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  ;   }   


Izlaz

 Error: Failed to read data  

Pogreš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++
   #include          using     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  ;   }   


Izlaz

 Reached 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  ;   }   


Izlaz

pisatiBinarniBinarna 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++
   fstream     fileInstance  (  'fileName.bin'       ios  ::  in  |     ios  ::  binary  );   
C++
   #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  ;   }   


Izlaz

 File Data: Welcome to GeeksForGeeks  

Ostale 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:

  • C++ program za brisanje datoteke
  • Dodavanje niza u postojeću datoteku
  • Kopirajte jednu datoteku u drugu datoteku
Napravi kviz