Tiedostojen käsittely C++:ssa

Tiedostojen käsittely C++:ssa

Tiedostojen käsittely tarkoittaa tiedostoista lukemista ja niihin kirjoittamista (kuten .txt .csv jne.) käyttämällä C++-standardikirjaston tarjoamia luokkia.

  • Ohjelmat toimivat RAM-muistissa, mikä tarkoittaa, että tiedot ovat olemassa vain ohjelman ollessa käynnissä, kun ohjelma lopettaa, kaikki RAM-muistissa olevat tiedot menetetään automaattisesti.
  • Tiedostojen käsittely mahdollistaa tietojen tallentamisen toissijaiseen muistiin (kuten HDD tai SSD), jotta ne voidaan säilyttää pysyvästi ja tallentaa ja käyttää myös ohjelman päättymisen jälkeen.
  • Tiedostotoimintoja varten C++ tarjoaa tiedostovirtaluokkia otsikko, kuten offstream ifstream fstream.

Tiedoston avaaminen

Ennen kuin luet tiedostosta tai kirjoitamme tiedostoon, meidän on ensin avattava se. Tiedoston avaaminen lataa sen RAM-muistiin. C++:ssa avaamme tiedoston luomalla siihen streamin käyttämällä fstream luokka, joka edustaa tiedostovirtaa eli tiedoston syöttämiseen ja ulostuloon tarkoitettua virtaa.

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

jossa



  • str: Virolle annettu nimi
  • tiedostonimi: Tiedoston nimi
  • -tilassa : Edustaa tapaa, jolla aiomme olla vuorovaikutuksessa tiedoston kanssa.

Tiedoston avaustilat

Tiedoston avaustila osoittaa, että tiedosto on avattu lukemista varten kirjoittamista tai liittämistä varten. Alla on luettelo kaikista C++:n tiedostotiloista:

tila Kuvaus
ios::in Tiedosto auki lukemista varten. Jos tiedostoa ei ole olemassa, avaaminen epäonnistuu.
ios::out Tiedosto auki kirjoittamista varten: sisäinen stream-puskuri tukee tulostustoimintoja.
ios::binääri Toiminnot suoritetaan binääritilassa tekstin sijaan.
ios::ate Tulostuskohta alkaa tiedoston lopusta.
ios::app Kaikki tulostustoiminnot tapahtuvat tiedoston lopussa ja liitetään sen olemassa olevaan sisältöön.
ios::runko Kaikki tiedoston sisältö ennen sen avaamista hylätään.

Esimerkiksi jos haluamme avata tiedoston lukemista varten, käytämme seuraavaa avaustilaa:

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

Vastaavasti, jos haluamme avata tiedoston kirjoittamista varten, käytämme seuraavaa:

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

Nämä tilat voidaan myös yhdistää OR-operaattorilla (|). Voit esimerkiksi avata tiedostovirran sekä luku- että kirjoitustilassa kuvan osoittamalla tavalla:

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

Jos kirjoitustilassa avattua tiedostoa ei ole olemassa, luodaan uusi tiedosto. Mutta jos lukutilassa avattua tiedostoa ei ole olemassa, uutta tiedostoa ei luoda ja tehdään poikkeus

Muut tiedostovirrat

fstream ei ole ainoa C++:n tarjoama tiedostovirta. On olemassa kaksi erikoisempaa streamia:

  • ifstream : tarkoittaa syöttötiedostovirtaa. Se vastaa avausta fstream in ios::in -tilassa.
  • virran ulkopuolella : tarkoittaa tulostustiedostovirtaa. Se vastaa fstreamin avaamista ios::out -tilassa.

Yllä olevat tilat ovat oletustiloja näille virroille. Näitä tiloja ei voi muuttaa, mutta ne voidaan yhdistää muiden tilojen kanssa. Nyt syötteenä voimme käyttää myös ifstreamiä kuvan mukaisesti:

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

Samoin ulostulolle:

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

Kirjoita tiedot tiedostoon

Kun tiedosto on avattu kirjoitustilassa käyttämällä jompaakumpaa fstream tai virran ulkopuolella voimme suorittaa kirjoitusoperaation samalla tavalla kuin cout-toiminnolla < < 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  ;   }   
kirjoittaaGFG.text

Lue tiedot tiedostosta

Kun tiedosto on avattu lukutilassa joko fstream- tai ifstream-toiminnolla, voimme suorittaa kirjoitustoiminnon samalla tavalla kuin cin-sovelluksella. >> operaattori.

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


Lähtö

 Read String: Welcome  

Tällä on sama ongelma kuin cinillä. Syöte otetaan vain ensimmäiseen välilyöntimerkkiin asti. Tämän välttämiseksi voimme käyttää getline() toimi kuvan mukaisesti:

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


Lähtö

 Read String: Welcome to GeeksforGeeks.  

Tiedoston sulkeminen

Tiedoston sulkeminen tarkoittaa siihen liittyvän streamin sulkemista ja käyttämiemme resurssien vapauttamista. On tärkeää sulkea tiedosto sen jälkeen, kun se on valmis, erityisesti pitkään käynnissä olevissa ohjelmissa, jotta vältytään muistivuotojen tietojen häviämiseltä jne.

C++:ssa tiedostot suljetaan komennolla lähellä() jäsentoiminto, joka on läsnä kaikissa tiedostovirroissa.

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


Lähtö

 Read String: Welcome to GeeksforGeeks.  

Virheet tiedostojen käsittelyssä

Tiedostojen käsittelyssä voi ilmetä monenlaisia ​​virheitä, kuten tiedostoa ei löydy levy täynnä jne. Ohjelmiemme tulee odottaa yleisiä virheitä ja niiden pitäisi pystyä käsittelemään niitä oikein. Seuraavassa on joitain yleisiä virheitä, joita voi tapahtua tiedostojen käsittelyn aikana:

Tiedoston avaamisvirhe

Saattaa olla tapauksia, joissa tiedostoa ei avata useista syistä, kuten sen puuttumisesta tai ohjelmalla ei ole lupaa avata sitä jne. Tässä tapauksessa voimme käyttää is_open() tiedostovirtaluokkien jäsentoiminto tarkistaaksesi, onko tiedosto avattu onnistuneesti vai ei.

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


Lähtö

 Error: Unable to open file!  

Tietojen lukemisen/kirjoituksen epäonnistuminen

Toinen yleinen virhe on epäonnistuminen tietojen lukemisessa tai kirjoittamisessa esimerkiksi virheellisestä tilasta jne. Tässä tapauksessa voimme vahvistaa toiminnot jokaisen luku-/kirjoitusyrityksen jälkeen. Esimerkiksi lukeminen käyttämällä getline() voidaan vahvistaa seuraavasti:

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


Lähtö

 Error: Failed to read data  

Tiedoston loppu (EOF) -virhe

Jos yrität lukea tiedoston lopun pidemmälle, se voi aiheuttaa EOF-virheen. Näin voi käydä, jos et tarkista tiedoston loppua ennen lukemista. Voimme tarkistaa EOF:n käyttämällä eof() jäsentoiminto.

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


Lähtö

 Reached end of file.  

Huomaa, että olemme myös vahvistaneet lukutoiminnon ennen EOF as:n tarkistamista getline() tulee vain takaisin nullptr vaikka luku epäonnistuu jostain syystä.

Binääritiedostojen käsittely

Pystymme käsittelemään myös C++:ssa binääritiedostot jotka tallentavat tiedot raakamuodossa. Binääritietojen lukemiseen ja kirjoittamiseen on käytettävä ios::binääri lippu, kun luot/avaat binaaritiedostoa.

Kirjoita binaaritiedostoon

Jos haluat kirjoittaa tietoja binääritiedostoon, meidän on ensin avattava tai luotava tiedosto ios::binääri -tilassa.

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


Lähtö

kirjoittaa binaariBinääritiedosto

Lukeminen binaaritiedostosta

Aivan kuten avaamme tiedoston binääritilassa kirjoittaaksemme tietoja lukeaksemme tietoja binääritiedostosta, meidän on avattava tiedosto lukutilassa käyttämällä ios::in .

Syntaksi:

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


Lähtö

 File Data: Welcome to GeeksForGeeks  

Muut tiedostotoiminnot

Voimme myös tehdä enemmän toimintoja käsitelläksesi tiedostoa C++-ohjelmastamme. joitain yleisiä tiedostotoimintoja ovat:

  • C++-ohjelma tiedoston poistamiseen
  • Liitä merkkijono olemassa olevaan tiedostoon
  • Kopioi yksi tiedosto toiseen tiedostoon
Luo tietokilpailu

Top Artikkelit

Luokka

Mielenkiintoisia Artikkeleita