Fájlkezelés C++ nyelven

Fájlkezelés C++ nyelven

A fájlkezelés a C++ szabványkönyvtár által biztosított osztályok használatával olvasást és írást jelent fájlokból (például .txt .csv stb.).

  • A RAM-ban futó programok azt jelenti, hogy az adatok csak a program futása közben léteznek, amikor a program leállítja a RAM-ban lévő összes adatot, és automatikusan elveszik.
  • A fájlkezelés lehetővé teszi az adatok másodlagos memóriában (például HDD vagy SSD) történő tárolását, így azok tartósan megőrizhetők, és a program leállása után is elmenthetők és elérhetők.
  • A fájlműveletekhez a C++ fájlfolyam osztályokat biztosít a fejléc, például az offstream ifstream fstream.

Fájl megnyitása

Mielőtt egy fájlból olvasnánk vagy oda írnánk, először meg kell nyitnunk azt. A fájl megnyitása betölti a fájlt a RAM-ba. A C++ nyelven úgy nyitunk meg egy fájlt, hogy a segítségével streamet hozunk létre hozzá fstream osztályok, amelyek a fájlfolyamot képviselik, azaz a fájl bemeneti és kimeneti adatfolyamát.

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

ahol

  • str: A folyamnak adott név
  • fájlnév: A fájl neve
  • mód : Azt a módot jelöli, ahogyan a fájllal interakcióba lépünk.

Fájlmegnyitási módok

A fájlmegnyitási mód jelzi, hogy a fájl meg van nyitva olvasásra, írásra vagy hozzáfűzésre. Az alábbiakban a C++ összes fájlmódjának listája található:

Mód Leírás
ios::in Fájl megnyitva olvasásra. Ha a fájl nem létezik, a megnyitási művelet meghiúsul.
ios::out Fájl írásra nyitva: a belső adatfolyam puffer támogatja a kimeneti műveleteket.
ios::bináris A műveleteket szöveg helyett bináris módban hajtják végre.
ios::ate A kimeneti pozíció a fájl végén kezdődik.
ios::app Minden kimeneti művelet a fájl végén történik, hozzáfűzve a meglévő tartalmát.
ios::trunk Minden olyan tartalom, amely a fájlban a megnyitás előtt létezett, eldobásra kerül.

Például ha meg akarjuk nyitni a fájlt olvasásra, akkor a következő megnyitási módot használjuk:

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

Hasonlóképpen, ha meg akarjuk nyitni a fájlt írásra, a következőket használjuk:

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

Ezek a módok a VAGY operátor (|) használatával is kombinálhatók. Például megnyithatja a fájlfolyamot olvasási és írási módban is, az alábbi módon:

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

Ha az írási módban megnyitott fájl nem létezik, akkor új fájl jön létre. De ha az olvasási módban megnyitott fájl nem létezik, akkor nem jön létre új fájl, és kivételt dob

Egyéb fájlfolyamok

fstream nem az egyetlen fájlfolyam, amelyet a C++ biztosít. Van még két speciális adatfolyam:

  • ifstream : Az input file stream rövidítése. Ez egyenértékű az fstream in megnyitásával ios::in mód.
  • folyamon kívül : A kimeneti fájl stream rövidítése. Ez egyenértékű az fstream in megnyitásával ios::out mód.

A fenti módok az alapértelmezett módok ezekhez az adatfolyamokhoz. Ezek a módok nem változtathatók, de összeilleszthetők más módokkal. Most bemenetként használhatjuk az ifstream-et is, az ábrán látható módon:

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

Hasonlóképpen a kimenethez:

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

Adatok írása fájlba

Miután a fájlt írási módban megnyitotta valamelyik használatával fstream vagy folyamon kívül az írási műveletet hasonló módon hajthatjuk végre, mint a cout használatával < < 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  ;   }   
írjGFG.text

Adatok olvasása fájlból

Ha a fájlt olvasási módban megnyitjuk az fstream vagy ifstream használatával, az írási műveletet hasonló módon hajthatjuk végre, mint a cin használatával. >> 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  ;   }   


Kimenet

 Read String: Welcome  

Ennek ugyanaz a problémája, mint a cinnek. A bevitel csak az első szóköz karakterig történik. Ennek elkerülésére használhatjuk a getline() a képen látható funkció:

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


Kimenet

 Read String: Welcome to GeeksforGeeks.  

A Fájl bezárása

A fájl bezárása a kapcsolódó adatfolyam bezárását és a használt erőforrások felszabadítását jelenti. Fontos, hogy bezárja a fájlt, miután végzett vele, különösen a régóta futó programokban, hogy elkerülje a memóriaszivárgást, az adatvesztést stb.

C++ nyelven a fájlok a következővel zárhatók be közeli() tag függvény, amely minden fájlfolyamban megtalálható.

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


Kimenet

 Read String: Welcome to GeeksforGeeks.  

Fájlkezelési hibák

Számos különböző típusú hiba fordulhat elő a fájlkezelés során, például a fájl nem található megtelt lemez stb. Programjainknak számítaniuk kell a gyakori hibákra, és tudniuk kell azokat megfelelően kezelni. Az alábbiakban felsorolunk néhány gyakori hibát, amelyek a fájlkezelés során fordulhatnak elő:

Fájlmegnyitási hiba

Előfordulhatnak olyan esetek, amikor a fájl különböző okok miatt nem nyílik meg, például nem létezik, vagy a programnak nincs engedélye a megnyitására stb. Ebben az esetben használhatjuk a is_open() a fájlfolyam osztályok tagja funkciója annak ellenőrzésére, hogy a fájl sikeresen megnyílt-e vagy sem.

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


Kimenet

 Error: Unable to open file!  

Adatok olvasási/írási elmulasztása

Egy másik gyakori hiba az adatok olvasási vagy írási hibája, például helytelen mód stb. miatt. Ebben az esetben minden olvasási/írási kísérlet után ellenőrizhetjük a műveleteket. Például a getline() használatával történő olvasás a következőképpen érvényesíthető:

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


Kimenet

 Error: Failed to read data  

Fájlvégi (EOF) hiba

Ha a fájl végén túl akar olvasni, az EOF hibát okozhat. Ez akkor fordulhat elő, ha olvasás előtt nem ellenőrzi a fájl végét. Használatával ellenőrizhetjük az EOF-t eof() tag funkció.

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


Kimenet

 Reached end of file.  

Figyeljük meg, hogy az EOF as ellenőrzése előtt az olvasási műveletet is érvényesítettük getline() csak vissza fog térni nullptr akkor is, ha az olvasás bármilyen okból meghiúsul.

Bináris fájlok kezelése

C++-ban is tudjuk kezelni bináris fájlok amelyek nyers formátumban tárolják az adatokat. A bináris adatok olvasásához és írásához a ios::bináris zászló bináris fájl létrehozásakor/megnyitásakor.

Írja be a bináris fájlba

Adatok bináris fájlba írásához először meg kell nyitnunk vagy létrehoznunk kell a fájlt ios::bináris mód.

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


Kimenet

írásBinárisBináris fájl

Olvasás bináris fájlból

Ugyanúgy, ahogyan megnyitunk egy fájlt bináris módban, hogy adatokat írhassunk a bináris fájlból való adatok olvasásához, a fájlt olvasási módban kell megnyitnunk a ios::in .

Szintaxis:

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


Kimenet

 File Data: Welcome to GeeksForGeeks  

Egyéb fájlműveletek

Több műveletet is elvégezhetünk a C++ programunkból származó fájlok kezeléséhez. néhány gyakori fájlművelet:

  • C++ program egy fájl törléséhez
  • Karakterlánc hozzáfűzése egy meglévő fájlhoz
  • Másoljon egy fájlt egy másik fájlba
Kvíz létrehozása