logo

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 klasesgalvene, 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::inFails atvērts lasīšanai. Ja fails neeksistē, atvēršanas darbība neizdodas.
ios::outFails atvērts rakstīšanai: iekšējais straumes buferis atbalsta izvades darbības.
ios::bināraisDarbības tiek veiktas binārajā režīmā, nevis teksta režīmā.
ios::ateIzvades pozīcija sākas faila beigās.
ios::appVisas izvades darbības notiek faila beigās, pievienojot tā esošajam saturam.
ios::stumbrsJebkurš 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:

veiktspējas pārbaude
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īt' title=GFG.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.

kas ir obj java

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ārs' loading='lazy' title=Binā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