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 a
fejlé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::in | Fájl megnyitva olvasásra. Ha a fájl nem létezik, a megnyitási művelet meghiúsul. |
| ios::out | Fájl írásra nyitva: a belső adatfolyam puffer támogatja a kimeneti műveleteket. |
| ios::bináris | A műveleteket szöveg helyett bináris módban hajtják végre. |
| ios::ate | A kimeneti pozíció a fájl végén kezdődik. |
| ios::app | Minden kimeneti művelet a fájl végén történik, hozzáfűzve a meglévő tartalmát. |
| ios::trunk | Minden 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 xdC++
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; }
GFG.textAdatok 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: WelcomeEnnek 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 dataFá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
Bináris fájlOlvasá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 GeeksForGeeksEgyé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:
Kvíz létrehozása
- 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