logo

Manipulácia so súbormi v C++

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 vhlavič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::inSúbor otvorený na čítanie. Ak súbor neexistuje, operácia otvorenia zlyhá.
ios::outSúbor otvorený na zápis: interná vyrovnávacia pamäť streamu podporuje výstupné operácie.
ios::binárneOperácie sa vykonávajú v binárnom režime a nie v textovom režime.
ios::ateVýstupná pozícia začína na konci súboru.
ios::aplikáciaVš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 miliarde
C++
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; } 
písať' title=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: Welcome

Má 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 java
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; } 


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 data

Chyba 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

písaťBinárne' loading='lazy' title=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ú:

  • 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
Vytvoriť kvíz