Failu apstrāde programmā C++

Failu apstrāde programmā C++

Failu apstrāde nozīmē lasīšanu un rakstīšanu failos (piemēram, .txt .csv utt.), izmantojot C++ standarta bibliotēkas nodrošinātās klases.

  • Programmas, kas darbojas RAM, kas nozīmē, ka dati pastāv tikai programmas darbības laikā, kad programma beidzas, visi RAM dati tiek zaudēti automātiski.
  • Failu apstrāde ļauj saglabāt datus sekundārajā atmiņā (piemēram, HDD vai SSD), lai tos varētu saglabāt pastāvīgi un tos var saglabāt un piekļūt pat pēc programmas darbības beigām.
  • Failu operācijām C++ nodrošina failu straumes klases galvene, piemēram, ofstream ifstream fstream.

Faila atvēršana

Pirms lasīšanas no faila vai rakstīšanas tajā, mums tas vispirms ir jāatver. Atverot failu, tas tiek ielādēts RAM. Programmā C++ mēs atveram failu, izveidojot tam straumi, izmantojot fstream klase, kas pārstāv faila straumi, t.i., straume faila ievadei un izvadei.

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

kur

  • str: Straumei piešķirts nosaukums
  • faila nosaukums: Faila nosaukums
  • režīmā : atspoguļo veidu, kādā mēs sadarbosimies ar failu.

Failu atvēršanas režīmi

Faila atvēršanas režīms norāda, ka fails ir atvērts lasīšanai, rakstīšanai vai pievienošanai. Zemāk ir visu C++ failu režīmu saraksts:

Režīms Apraksts
ios::in Fails atvērts lasīšanai. Ja fails neeksistē, atvēršanas darbība neizdodas.
ios::out Fails atvērts rakstīšanai: iekšējais straumes buferis atbalsta izvades darbības.
ios::binārais Darbības tiek veiktas binārajā režīmā, nevis teksta režīmā.
ios::ate Izvades pozīcija sākas faila beigās.
ios::app Visas izvades darbības notiek faila beigās, pievienojot tā esošajam saturam.
ios::stumbrs Jebkurš saturs, kas failā bija pirms tā atvēršanas, tiek atmests.

Piemēram ja mēs vēlamies atvērt failu lasīšanai, mēs izmantojam šādu atvēršanas režīmu:

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

Līdzīgi, ja vēlamies atvērt failu rakstīšanai, mēs izmantojam sekojošo:

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

Šos režīmus var arī kombinēt, izmantojot operatoru VAI (|). Piemēram, varat atvērt failu straumi gan lasīšanas, gan rakstīšanas režīmā, kā parādīts attēlā:

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

Ja rakstīšanas režīmā atvērtais fails neeksistē, tiek izveidots jauns fails. Bet, ja lasīšanas režīmā atvērtais fails neeksistē, jauns fails netiek izveidots un tiek izmests izņēmums

Citas failu straumes

fstream nav vienīgā failu straume, ko nodrošina C++. Ir vēl divas specializētas straumes:

  • ifstream : apzīmē ievades faila straumi. Tas ir līdzvērtīgs fstream in atvēršanai ios::in režīmā.
  • ārpus plūsmas : apzīmē izvades faila straumi. Tas ir līdzvērtīgs fstream in atvēršanai ios::out režīmā.

Iepriekš minētie režīmi ir noklusējuma režīmi šīm straumēm. Šos režīmus nevar mainīt, bet tos var apvienot ar citiem režīmiem. Tagad ievadei mēs varam izmantot arī ifstream, kā parādīts:

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

Līdzīgi izvadei:

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

Ierakstiet datus failā

Kad fails ir atvērts rakstīšanas režīmā, izmantojot kādu no fstream vai ārpus plūsmas mēs varam veikt rakstīšanas darbību līdzīgi kā ar cout izmantojot < < 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  ;   }   
rakstītGFG.teksts

Lasīt datus no faila

Kad fails ir atvērts lasīšanas režīmā, izmantojot fstream vai ifstream, mēs varam veikt rakstīšanas darbību līdzīgi kā ar cin, izmantojot >> operators.

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


Izvade

 Read String: Welcome  

Tam ir tāda pati problēma kā cin. Ievade tiek ievadīta tikai līdz pirmajai atstarpes rakstzīmei. Lai no tā izvairītos, mēs varam izmantot getline() funkcija, kā parādīts:

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


Izvade

 Read String: Welcome to GeeksforGeeks.  

Faila aizvēršana

Faila aizvēršana nozīmē saistītās straumes aizvēršanu un izmantoto resursu atbrīvošanu. Ir svarīgi aizvērt failu pēc tam, kad esat to pabeidzis, jo īpaši ilgstošās programmās, lai izvairītos no atmiņas noplūdes datu zuduma utt.

Programmā C++ faili tiek aizvērti, izmantojot aizvērt () dalībnieka funkcija, kas ir pieejama visās failu plūsmās.

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


Izvade

 Read String: Welcome to GeeksforGeeks.  

Kļūdas failu apstrādē

Failu apstrādē var rasties daudz dažādu kļūdu veidu, piemēram, fails nav atrasts, ja disks ir pilns utt. Mūsu programmām ir jārēķinās ar bieži sastopamām kļūdām un jāspēj tās pareizi apstrādāt. Tālāk ir norādītas dažas izplatītas kļūdas, kas var rasties failu apstrādes laikā.

Faila atvēršanas kļūme

Var būt gadījumi, kad fails netiek atvērts dažādu iemeslu dēļ, piemēram, tā neeksistē vai programmai nav atļaujas to atvērt utt. Šajā gadījumā mēs varam izmantot ir_atvērts() failu straumes klašu dalībnieka funkcija, lai pārbaudītu, vai fails ir veiksmīgi atvērts vai nē.

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


Izvade

 Error: Unable to open file!  

Datu lasīšanas/rakstīšanas neveiksme

Vēl viena izplatīta kļūda ir datu nolasīšanas vai rakstīšanas nespēja tādu iemeslu dēļ kā nepareizs režīms utt. Šajā gadījumā mēs varam apstiprināt darbības pēc katra lasīšanas/rakstīšanas mēģinājuma. Piemēram, lasīšanu, izmantojot getline(), var apstiprināt šādi:

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


Izvade

 Error: Failed to read data  

Faila beigu (EOF) kļūda

Mēģinot lasīt tālāk par faila beigām, var rasties EOF kļūda. Tas var notikt, ja pirms lasīšanas nepārbaudāt faila beigas. Mēs varam pārbaudīt EOF, izmantojot eof() dalībnieka 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  ;   }   


Izvade

 Reached end of file.  

Ņemiet vērā, ka pirms EOF as pārbaudes esam apstiprinājuši arī lasīšanas darbību getline() tikai atgriezīsies nullptr pat ja lasīšana kāda iemesla dēļ neizdodas.

Bināro failu apstrāde

C++ mēs varam arī rīkoties binārie faili kas glabā datus neapstrādātā formātā. Bināro datu lasīšanai un rakstīšanai jāizmanto ios::binārais karodziņš, veidojot/atverot bināro failu.

Ierakstiet binārajā failā

Lai rakstītu datus binārā failā, mums vispirms ir jāatver vai jāizveido fails ios::binārais režīmā.

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


Izvade

rakstītBinārsBinārais fails

Lasīšana no binārā faila

Tāpat kā mēs atveram failu binārajā režīmā, lai rakstītu datus, lai nolasītu datus no binārā faila, mums ir jāatver fails lasīšanas režīmā, izmantojot ios::in .

Sintakse:

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


Izvade

 File Data: Welcome to GeeksForGeeks  

Citas darbības ar failiem

Mēs varam arī veikt vairāk darbību, lai manipulētu ar failu no mūsu C++ programmas. dažas no izplatītākajām failu operācijām ir:

  • C++ programma faila dzēšanai
  • Pievienojiet virkni esošajā failā
  • Kopējiet vienu failu citā failā
Izveidojiet viktorīnu