Manipulácia so súbormi v C++

Manipulácia so súbormi v C++

Manipulácia so súbormi znamená čítanie a zápis do súborov (ako .txt .csv atď.) pomocou tried poskytovaných štandardnou knižnicou C++.

  • Programy bežia v RAM, čo znamená, že údaje existujú iba počas spustenia programu, keď program skončí, všetky údaje v RAM sa automaticky stratia.
  • Manipulácia so súbormi umožňuje ukladať dáta do sekundárnej pamäte (ako je HDD alebo SSD), takže môžu byť trvalo uchované a môžu byť uložené a prístupné aj po ukončení programu.
  • Pre operácie so súbormi C++ poskytuje triedy prúdov súborov v hlavička, ako napríklad ofstream ifstream fstream.

Otvorenie súboru

Pred čítaním alebo zápisom do súboru ho musíme najprv otvoriť. Otvorením súboru sa tento súbor načíta do pamäte RAM. V C++ otvárame súbor tak, že k nemu vytvoríme prúd pomocou fstream trieda, ktorá predstavuje prúd súboru, t. j. prúd pre vstup a výstup do súboru.

C++
   fstream     str  (  'filename.ext'       mode  );   

kde

  • str: Názov pridelený streamu
  • názov súboru: Názov súboru
  • režim : Predstavuje spôsob, akým budeme interagovať so súborom.

Režimy otvárania súborov

Režim otvárania súboru označuje, že súbor je otvorený na čítanie, zápis alebo pripojenie. Nižšie je uvedený zoznam všetkých režimov súborov v C++:

Režim Popis
ios::in Súbor otvorený na čítanie. Ak súbor neexistuje, operácia otvorenia zlyhá.
ios::out Súbor otvorený na zápis: interná vyrovnávacia pamäť streamu podporuje výstupné operácie.
ios::binárne Operácie sa vykonávajú v binárnom režime a nie v textovom režime.
ios::ate Výstupná pozícia začína na konci súboru.
ios::aplikácia Všetky výstupné operácie prebiehajú na konci súboru, ktorý sa pripája k jeho existujúcemu obsahu.
ios:: kmeň Všetok obsah, ktorý existoval v súbore pred jeho otvorením, sa zahodí.

Napríklad ak chceme súbor otvoriť na čítanie, použijeme nasledujúci režim otvárania:

C++
   fstream     filein  (  'file.txt'       ios  ::  in  );   

Podobne, ak chceme otvoriť súbor na zápis, použijeme nasledovné:

C++
   fstream     fileout  (  'file.txt'       ios  ::  out  );   

Tieto režimy je možné kombinovať aj pomocou operátora OR (|). Môžete napríklad otvoriť prúd súborov v režime čítania aj zápisu, ako je znázornené:

C++
   fstream     str  (  'file.txt'       ios  ::  in     |     ios  ::  out  );   

Ak súbor otvorený v režime zápisu neexistuje, vytvorí sa nový súbor. Ak však súbor otvorený v režime čítania neexistuje, nevytvorí sa žiadny nový súbor a vyvolá sa výnimka

Iné prúdy súborov

fstream nie je jediným tokom súborov poskytovaným C++. Existujú dva ďalšie špecializované prúdy:

  • ifstream : Znamená prúd vstupného súboru. Je to ekvivalent otvoreného fstream in ios::in režim.
  • ofstream : Znamená prúd výstupného súboru. Je to ekvivalentné otvoreniu fstream in ios::out režim.

Vyššie uvedené režimy sú predvolené režimy pre tieto toky. Tieto režimy nie je možné zmeniť, ale možno ich spojiť s inými režimami. Teraz na vstup môžeme použiť aj ifstream, ako je znázornené:

C++
   ifstream     filein  (  'file.txt'  );   

Podobne pre výstup:

C++
   ofstream     fileout  (  'file.txt'  );   

Zápis údajov do súboru

Po otvorení súboru v režime zápisu pomocou jedného z nich fstream alebo ofstream operáciu zápisu môžeme vykonať podobne ako pri použití 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  ;   }   
písaťGFG.text

Čítanie údajov zo súboru

Po otvorení súboru v režime čítania pomocou fstream alebo ifstream môžeme vykonať operáciu zápisu podobným spôsobom ako pri cin pomocou >> operátor.

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


Výstup

 Read String: Welcome  

Má to rovnaký problém ako cin. Zadávanie sa vykonáva len po prvý znak medzery. Aby sme tomu zabránili, môžeme použiť getline() funkcia ako je znázornené:

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


Výstup

 Read String: Welcome to GeeksforGeeks.  

Zatvorenie súboru

Zatvorenie súboru znamená zatvorenie súvisiaceho streamu a uvoľnenie zdrojov, ktoré používame. Je dôležité zavrieť súbor po dokončení, najmä v dlho spustených programoch, aby ste predišli strate údajov pri úniku pamäte atď.

V C++ sa súbory zatvárajú pomocou zavrieť() členská funkcia, ktorá je prítomná vo všetkých prúdoch súborov.

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


Výstup

 Read String: Welcome to GeeksforGeeks.  

Chyby pri práci so súbormi

Pri manipulácii so súbormi sa môže vyskytnúť mnoho rôznych typov chýb, napríklad súbor sa nenašiel na disku, atď. Naše programy by mali očakávať bežné chyby a mali by byť schopné ich správne spracovať. Nasledujú niektoré bežné chyby, ktoré sa môžu vyskytnúť počas spracovania súborov:

Zlyhanie pri otvorení súboru

Môžu nastať prípady, keď sa súbor neotvorí z rôznych dôvodov, napríklad neexistuje alebo program nemá povolenie na jeho otvorenie atď. V tomto prípade môžeme použiť is_open() členská funkcia tried prúdov súborov na kontrolu, či je súbor otvorený alebo nie.

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


Výstup

 Error: Unable to open file!  

Zlyhanie pri čítaní/zápise údajov

Ďalšou častou chybou je zlyhanie čítania alebo zápisu údajov z dôvodov, ako je nesprávny režim atď. V tomto prípade môžeme operácie overiť po každom pokuse o čítanie/zápis. Napríklad čítanie pomocou getline() možno overiť takto:

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


Výstup

 Error: Failed to read data  

Chyba konca súboru (EOF).

Pokus o čítanie za koniec súboru môže spôsobiť chybu EOF. To sa môže stať, keď pred čítaním neskontrolujete koniec súboru. Môžeme skontrolovať použitie EOF eof() členská funkcia.

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


Výstup

 Reached end of file.  

Všimnite si, že sme tiež overili operáciu čítania pred kontrolou EOF as getline() sa len vráti nullptr aj keď čítanie z akéhokoľvek dôvodu zlyhá.

Manipulácia s binárnymi súbormi

V C++ si tiež poradíme binárne súbory ktoré ukladajú dáta v nespracovanom formáte. Na čítanie a zápis binárnych údajov je potrebné použiť ios::binárne príznak pri vytváraní/otváraní binárneho súboru.

Zapíšte do binárneho súboru

Ak chcete zapísať údaje do binárneho súboru, najprv musíme súbor otvoriť alebo vytvoriť ios::binárne režim.

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


Výstup

písaťBinárneBinárny súbor

Čítanie z binárneho súboru

Rovnako ako otvárame súbor v binárnom režime na zapisovanie údajov na čítanie údajov z binárneho súboru, musíme súbor otvoriť v režime čítania pomocou ios::in .

Syntax:

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


Výstup

 File Data: Welcome to GeeksForGeeks  

Ďalšie operácie so súbormi

Môžeme tiež vykonať viac operácií na manipuláciu so súborom z nášho programu C++. niektoré z bežných operácií so súbormi sú:

  • C++ program na odstránenie súboru
  • Pripojte reťazec do existujúceho súboru
  • Skopírujte jeden súbor do iného súboru
Vytvoriť kvíz