Upravljanje datotek v C++

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

To 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++
   #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  ;   }   


Izhod

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


Izhod

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


Izhod

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


Izhod

 Error: Failed to read data  

Napaka 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++
   #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  ;   }   


Izhod

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


Izhod

writeBinaryBinarna 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++
   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  ;   }   


Izhod

 File Data: Welcome to GeeksForGeeks  

Druge operacije datotek

Prav tako lahko izvedemo več operacij za manipulacijo datoteke iz našega programa C++. nekatere običajne operacije datotek so:

  • Program C++ za brisanje datoteke
  • Dodajanje niza v obstoječo datoteko
  • Kopirajte eno datoteko v drugo datoteko
Ustvari kviz