Manipulácia so súbormi znamená čítanie a zápis do súborov (ako .txt .csv atď.) pomocou tried poskytovaných štandardnou knižnicou C++.
- Programy bežia v RAM, čo znamená, že údaje existujú iba počas spustenia programu, keď program skončí, všetky údaje v RAM sa automaticky stratia.
- Manipulácia so súbormi umožňuje ukladať dáta do sekundárnej pamäte (ako je HDD alebo SSD), takže môžu byť trvalo uchované a môžu byť uložené a prístupné aj po ukončení programu.
- Pre operácie so súbormi C++ poskytuje triedy prúdov súborov v
hlavička, ako napríklad ofstream ifstream fstream.
Otvorenie súboru
Pred čítaním alebo zápisom do súboru ho musíme najprv otvoriť. Otvorením súboru sa tento súbor načíta do pamäte RAM. V C++ otvárame súbor tak, že k nemu vytvoríme prúd pomocou fstream trieda, ktorá predstavuje prúd súboru, t. j. prúd pre vstup a výstup do súboru.
C++fstream str('filename.ext' mode);
kde
- str: Názov pridelený streamu
- názov súboru: Názov súboru
- režim : Predstavuje spôsob, akým budeme interagovať so súborom.
Režimy otvárania súborov
Režim otvárania súboru označuje, že súbor je otvorený na čítanie, zápis alebo pripojenie. Nižšie je uvedený zoznam všetkých režimov súborov v C++:
| Režim | Popis |
|---|---|
| ios::in | Súbor otvorený na čítanie. Ak súbor neexistuje, operácia otvorenia zlyhá. |
| ios::out | Súbor otvorený na zápis: interná vyrovnávacia pamäť streamu podporuje výstupné operácie. |
| ios::binárne | Operácie sa vykonávajú v binárnom režime a nie v textovom režime. |
| ios::ate | Výstupná pozícia začína na konci súboru. |
| ios::aplikácia | Všetky výstupné operácie prebiehajú na konci súboru, ktorý sa pripája k jeho existujúcemu obsahu. |
| ios:: kmeň | Všetok obsah, ktorý existoval v súbore pred jeho otvorením, sa zahodí. |
Napríklad ak chceme súbor otvoriť na čítanie, použijeme nasledujúci režim otvárania:
C++fstream filein('file.txt' ios::in);
Podobne, ak chceme otvoriť súbor na zápis, použijeme nasledovné:
koľko 0 v miliardeC++
fstream fileout('file.txt' ios::out);
Tieto režimy je možné kombinovať aj pomocou operátora OR (|). Môžete napríklad otvoriť prúd súborov v režime čítania aj zápisu, ako je znázornené:
C++fstream str('file.txt' ios::in | ios::out);
Ak súbor otvorený v režime zápisu neexistuje, vytvorí sa nový súbor. Ak však súbor otvorený v režime čítania neexistuje, nevytvorí sa žiadny nový súbor a vyvolá sa výnimka
Iné prúdy súborov
fstream nie je jediným tokom súborov poskytovaným C++. Existujú dva ďalšie špecializované prúdy:
- ifstream : Znamená prúd vstupného súboru. Je to ekvivalent otvoreného fstream in ios::in režim.
- ofstream : Znamená prúd výstupného súboru. Je to ekvivalentné otvoreniu fstream in ios::out režim.
Vyššie uvedené režimy sú predvolené režimy pre tieto toky. Tieto režimy nie je možné zmeniť, ale možno ich spojiť s inými režimami. Teraz na vstup môžeme použiť aj ifstream, ako je znázornené:
C++ifstream filein('file.txt');
Podobne pre výstup:
C++ofstream fileout('file.txt');
Zápis údajov do súboru
Po otvorení súboru v režime zápisu pomocou jedného z nich fstream alebo ofstream operáciu zápisu môžeme vykonať podobne ako pri použití cout << 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.textČítanie údajov zo súboru
Po otvorení súboru v režime čítania pomocou fstream alebo ifstream môžeme vykonať operáciu zápisu podobným spôsobom ako pri cin pomocou >> 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; }
Výstup
Read String: WelcomeMá to rovnaký problém ako cin. Zadávanie sa vykonáva len po prvý znak medzery. Aby sme tomu zabránili, môžeme použiť getline() funkcia ako je znázornené:
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; }
Výstup
Read String: Welcome to GeeksforGeeks.Zatvorenie súboru
Zatvorenie súboru znamená zatvorenie súvisiaceho streamu a uvoľnenie zdrojov, ktoré používame. Je dôležité zavrieť súbor po dokončení, najmä v dlho spustených programoch, aby ste predišli strate údajov pri úniku pamäte atď.
V C++ sa súbory zatvárajú pomocou zavrieť() členská funkcia, ktorá je prítomná vo všetkých prúdoch súborov.
zoznam vytvárania javaC++
#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; }
Výstup
Read String: Welcome to GeeksforGeeks.Chyby pri práci so súbormi
Pri manipulácii so súbormi sa môže vyskytnúť mnoho rôznych typov chýb, napríklad súbor sa nenašiel na disku, atď. Naše programy by mali očakávať bežné chyby a mali by byť schopné ich správne spracovať. Nasledujú niektoré bežné chyby, ktoré sa môžu vyskytnúť počas spracovania súborov:
Zlyhanie pri otvorení súboru
Môžu nastať prípady, keď sa súbor neotvorí z rôznych dôvodov, napríklad neexistuje alebo program nemá povolenie na jeho otvorenie atď. V tomto prípade môžeme použiť is_open() členská funkcia tried prúdov súborov na kontrolu, či je súbor otvorený alebo nie.
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; }
Výstup
Error: Unable to open file!Zlyhanie pri čítaní/zápise údajov
Ďalšou častou chybou je zlyhanie čítania alebo zápisu údajov z dôvodov, ako je nesprávny režim atď. V tomto prípade môžeme operácie overiť po každom pokuse o čítanie/zápis. Napríklad čítanie pomocou getline() možno overiť takto:
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; }
Výstup
Error: Failed to read dataChyba konca súboru (EOF).
Pokus o čítanie za koniec súboru môže spôsobiť chybu EOF. To sa môže stať, keď pred čítaním neskontrolujete koniec súboru. Môžeme skontrolovať použitie EOF eof() členská funkcia.
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; }
Výstup
Reached end of file.Všimnite si, že sme tiež overili operáciu čítania pred kontrolou EOF as getline() sa len vráti nullptr aj keď čítanie z akéhokoľvek dôvodu zlyhá.
Manipulácia s binárnymi súbormi
V C++ si tiež poradíme binárne súbory ktoré ukladajú dáta v nespracovanom formáte. Na čítanie a zápis binárnych údajov je potrebné použiť ios::binárne príznak pri vytváraní/otváraní binárneho súboru.
Zapíšte do binárneho súboru
Ak chcete zapísať údaje do binárneho súboru, najprv musíme súbor otvoriť alebo vytvoriť ios::binárne režim.
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; }
Výstup
Binárny súborČítanie z binárneho súboru
Rovnako ako otvárame súbor v binárnom režime na zapisovanie údajov na čítanie údajov z binárneho súboru, musíme súbor otvoriť v režime čítania pomocou ios::in .
Syntax:
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; }
Výstup
File Data: Welcome to GeeksForGeeksĎalšie operácie so súbormi
Môžeme tiež vykonať viac operácií na manipuláciu so súborom z nášho programu C++. niektoré z bežných operácií so súbormi sú:
Vytvoriť kvíz
- C++ program na odstránenie súboru
- Pripojte reťazec do existujúceho súboru
- Skopírujte jeden súbor do iného súboru