logo

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 afejlé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::inFájl megnyitva olvasásra. Ha a fájl nem létezik, a megnyitási művelet meghiúsul.
ios::outFájl írásra nyitva: a belső adatfolyam puffer támogatja a kimeneti műveleteket.
ios::binárisA műveleteket szöveg helyett bináris módban hajtják végre.
ios::ateA kimeneti pozíció a fájl végén kezdődik.
ios::appMinden kimeneti művelet a fájl végén történik, hozzáfűzve a meglévő tartalmát.
ios::trunkMinden 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:

mit jelent xd
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; } 
írj' title=GFG.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.

stlc

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áris' loading='lazy' title=Biná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