logo

Руковање датотекама у Ц++

Руковање датотекама значи читање и писање у датотеке (као што је .ткт .цсв итд.) коришћењем класа које обезбеђује стандардна библиотека Ц++.

  • Програми се покрећу у РАМ-у, што значи да подаци постоје само док је програм покренут када се програм заврши, сви подаци у РАМ-у се аутоматски губе.
  • Руковање датотекама омогућава складиштење података у секундарној меморији (као што је ХДД или ССД) тако да се могу трајно сачувати и сачувати и приступити чак и након завршетка програма.
  • За операције са датотекама Ц++ обезбеђује класе токова датотека узаглавље као што је офстреам ифстреам фстреам.

Отварање датотеке

Пре читања из датотеке или писања у датотеку, прво морамо да је отворимо. Отварање датотеке учитава ту датотеку у РАМ. У Ц++ отварамо датотеку тако што креирамо ток до ње користећи фстреам класе које представљају ток датотеке, односно ток за унос и излаз у датотеку.

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

где



  • стр: Име дато току
  • име датотеке: Назив датотеке
  • режим : Представља начин на који ћемо ступити у интеракцију са датотеком.

Режими отварања датотека

Режим отварања датотеке означава да је датотека отворена за читање, писање или додавање. Испод је листа свих режима датотека у Ц++:

Моде Опис
иос::инОтворена датотека за читање. Ако датотека не постоји, операција отварања не успева.
иос::оутДатотека отворена за писање: интерни бафер тока подржава излазне операције.
иос::бинариОперације се изводе у бинарном режиму, а не у тексту.
иос::атеИзлазна позиција почиње на крају датотеке.
иос::аппСве излазне операције се дешавају на крају датотеке и додаје се њеном постојећем садржају.
иос::трункСав садржај који је постојао у датотеци пре отварања се одбацује.

На пример ако желимо да отворимо датотеку за читање користимо следећи режим отварања:

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

Слично, ако желимо да отворимо датотеку за писање, користимо следеће:

карактер у стринг у Јави
C++
fstream fileout('file.txt' ios::out); 

Ови режими се такође могу комбиновати коришћењем ОР оператора (|). На пример, можете отворити ток датотеке у режиму читања и писања као што је приказано:

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

Ако датотека отворена у режиму писања не постоји, креира се нова датотека. Али ако датотека отворена у режиму читања не постоји, онда се не креира нова датотека и избацује се изузетак

Други токови датотека

фстреам није једини ток датотека који пружа Ц++. Постоје још два специјализована тока:

  • ифстреам : Означава ток улазне датотеке. То је еквивалентно отварању фстреам-а иос::ин режим.
  • офстреам : Означава ток излазне датотеке. То је еквивалентно отварању фстреам-а у иос::оут режим.

Горе наведени режими су подразумевани режими за ове токове. Ови режими се не могу мењати, али се могу спојити заједно са другим режимима. Сада за унос можемо користити и ифстреам као што је приказано:

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

Слично за излаз:

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

Упишите податке у датотеку

Када се датотека отвори у режиму писања помоћу било које фстреам или офстреам можемо да извршимо операцију писања на сличан начин као код коришћења цоут-а << 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; } 
писати' title=ГФГ.тект

Читање података из датотеке

Када се датотека отвори у режиму читања користећи фстреам или ифстреам, можемо извршити операцију писања на сличан начин као са цин користећи >> оператер.

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


Излаз

Read String: Welcome

Ово има исти проблем као и цин. Унос се узима само до првог знака размака. Да бисмо то избегли, можемо користити гетлине() функција као што је приказано:

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


Излаз

Read String: Welcome to GeeksforGeeks.

Затварање датотеке

Затварање датотеке значи затварање повезаног тока и ослобађање ресурса које користимо. Важно је да затворите датотеку након што завршите са њом, посебно у дуготрајним програмима да бисте избегли губитак меморије, губитак података итд.

У Ц++ датотеке се затварају помоћу затвори() функција члана која је присутна у свим токовима датотека.

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


Излаз

Read String: Welcome to GeeksforGeeks.

Грешке у руковању датотекама

Много различитих типова грешака може да се јави у руковању датотекама, као што је датотека која није пронађена, диск је пун итд. Наши програми би требало да очекују уобичајене грешке и требало би да буду у стању да их правилно рукују. Следе неке уобичајене грешке које се могу јавити током руковања датотекама:

Неуспешно отварање датотеке

Могу постојати случајеви у којима се датотека не отвара из разних разлога као што је да не постоји или програм нема дозволу да је отвори итд. У овом случају можемо користити ис_опен() функција члана класа тока датотека да провери да ли је датотека успешно отворена или не.

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


Излаз

Error: Unable to open file!

Неуспех читања/писања података

Још једна уобичајена грешка је неуспех читања или писања података из разлога као што је нетачан режим итд. У овом случају можемо потврдити операције након сваког покушаја читања/писања. На пример, читање помоћу гетлине() може се потврдити на следећи начин:

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


Излаз

Error: Failed to read data

Грешка на крају датотеке (ЕОФ).

Покушај читања даље од краја датотеке може изазвати ЕОФ грешку. Ово се може десити када не проверите да ли је крај датотеке пре читања. Можемо да проверимо да ли користимо ЕОФ еоф() функција члана.

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


Излаз

Reached end of file.

Приметите да смо такође потврдили операцију читања пре провере ЕОФ као гетлине() само ће се вратити нуллптр чак и ако читање не успе из било ког разлога.

Руковање бинарним датотекама

У Ц++ такође можемо да обрадимо бинарне датотеке који чувају податке у сировом формату. За читање и писање бинарних података морате користити иос::бинари заставицу приликом креирања/отварања бинарне датотеке.

Упишите у бинарну датотеку

Да бисмо записали податке у бинарну датотеку, прво морамо да отворимо или креирамо датотеку у њој иос::бинари режим.

цео број у низ у Јави
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; } 


Излаз

вритеБинари' loading='lazy' title=Бинарна датотека

Читање из бинарне датотеке

Баш као што отварамо датотеку у бинарном режиму да бисмо уписали податке за читање података из бинарне датотеке, морамо отворити датотеку у режиму читања користећи иос::ин .

Синтакса:

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


Излаз

File Data: Welcome to GeeksForGeeks

Друге операције са датотекама

Такође можемо да урадимо више операција да манипулишемо датотеком из нашег Ц++ програма. неке од уобичајених операција са датотекама су:

  • Ц++ програм за брисање датотеке
  • Додајте стринг у постојећу датотеку
  • Копирајте једну датотеку у другу датотеку
Креирај квиз