logo

Tiedostojen käsittely C++:ssa

Tiedostojen käsittely tarkoittaa tiedostoista lukemista ja niihin kirjoittamista (kuten .txt .csv jne.) käyttämällä C++-standardikirjaston tarjoamia luokkia.

  • Ohjelmat toimivat RAM-muistissa, mikä tarkoittaa, että tiedot ovat olemassa vain ohjelman ollessa käynnissä, kun ohjelma lopettaa, kaikki RAM-muistissa olevat tiedot menetetään automaattisesti.
  • Tiedostojen käsittely mahdollistaa tietojen tallentamisen toissijaiseen muistiin (kuten HDD tai SSD), jotta ne voidaan säilyttää pysyvästi ja tallentaa ja käyttää myös ohjelman päättymisen jälkeen.
  • Tiedostotoimintoja varten C++ tarjoaa tiedostovirtaluokkiaotsikko, kuten offstream ifstream fstream.

Tiedoston avaaminen

Ennen kuin luet tiedostosta tai kirjoitamme tiedostoon, meidän on ensin avattava se. Tiedoston avaaminen lataa sen RAM-muistiin. C++:ssa avaamme tiedoston luomalla siihen streamin käyttämällä fstream luokka, joka edustaa tiedostovirtaa eli tiedoston syöttämiseen ja ulostuloon tarkoitettua virtaa.

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

jossa



  • str: Virolle annettu nimi
  • tiedostonimi: Tiedoston nimi
  • -tilassa : Edustaa tapaa, jolla aiomme olla vuorovaikutuksessa tiedoston kanssa.

Tiedoston avaustilat

Tiedoston avaustila osoittaa, että tiedosto on avattu lukemista varten kirjoittamista tai liittämistä varten. Alla on luettelo kaikista C++:n tiedostotiloista:

tila Kuvaus
ios::inTiedosto auki lukemista varten. Jos tiedostoa ei ole olemassa, avaaminen epäonnistuu.
ios::outTiedosto auki kirjoittamista varten: sisäinen stream-puskuri tukee tulostustoimintoja.
ios::binääriToiminnot suoritetaan binääritilassa tekstin sijaan.
ios::ateTulostuskohta alkaa tiedoston lopusta.
ios::appKaikki tulostustoiminnot tapahtuvat tiedoston lopussa ja liitetään sen olemassa olevaan sisältöön.
ios::runkoKaikki tiedoston sisältö ennen sen avaamista hylätään.

Esimerkiksi jos haluamme avata tiedoston lukemista varten, käytämme seuraavaa avaustilaa:

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

Vastaavasti, jos haluamme avata tiedoston kirjoittamista varten, käytämme seuraavaa:

kellua nauhaan
C++
fstream fileout('file.txt' ios::out); 

Nämä tilat voidaan myös yhdistää OR-operaattorilla (|). Voit esimerkiksi avata tiedostovirran sekä luku- että kirjoitustilassa kuvan osoittamalla tavalla:

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

Jos kirjoitustilassa avattua tiedostoa ei ole olemassa, luodaan uusi tiedosto. Mutta jos lukutilassa avattua tiedostoa ei ole olemassa, uutta tiedostoa ei luoda ja tehdään poikkeus

Muut tiedostovirrat

fstream ei ole ainoa C++:n tarjoama tiedostovirta. On olemassa kaksi erikoisempaa streamia:

  • ifstream : tarkoittaa syöttötiedostovirtaa. Se vastaa avausta fstream in ios::in -tilassa.
  • virran ulkopuolella : tarkoittaa tulostustiedostovirtaa. Se vastaa fstreamin avaamista ios::out -tilassa.

Yllä olevat tilat ovat oletustiloja näille virroille. Näitä tiloja ei voi muuttaa, mutta ne voidaan yhdistää muiden tilojen kanssa. Nyt syötteenä voimme käyttää myös ifstreamiä kuvan mukaisesti:

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

Samoin ulostulolle:

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

Kirjoita tiedot tiedostoon

Kun tiedosto on avattu kirjoitustilassa käyttämällä jompaakumpaa fstream tai virran ulkopuolella voimme suorittaa kirjoitusoperaation samalla tavalla kuin cout-toiminnolla << 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; } 
kirjoittaa' title=GFG.text

Lue tiedot tiedostosta

Kun tiedosto on avattu lukutilassa joko fstream- tai ifstream-toiminnolla, voimme suorittaa kirjoitustoiminnon samalla tavalla kuin cin-sovelluksella. >> operaattori.

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


Lähtö

Read String: Welcome

Tällä on sama ongelma kuin cinillä. Syöte otetaan vain ensimmäiseen välilyöntimerkkiin asti. Tämän välttämiseksi voimme käyttää getline() toimi kuvan mukaisesti:

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


Lähtö

Read String: Welcome to GeeksforGeeks.

Tiedoston sulkeminen

Tiedoston sulkeminen tarkoittaa siihen liittyvän streamin sulkemista ja käyttämiemme resurssien vapauttamista. On tärkeää sulkea tiedosto sen jälkeen, kun se on valmis, erityisesti pitkään käynnissä olevissa ohjelmissa, jotta vältytään muistivuotojen tietojen häviämiseltä jne.

C++:ssa tiedostot suljetaan komennolla lähellä() jäsentoiminto, joka on läsnä kaikissa tiedostovirroissa.

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


Lähtö

Read String: Welcome to GeeksforGeeks.

Virheet tiedostojen käsittelyssä

Tiedostojen käsittelyssä voi ilmetä monenlaisia ​​virheitä, kuten tiedostoa ei löydy levy täynnä jne. Ohjelmiemme tulee odottaa yleisiä virheitä ja niiden pitäisi pystyä käsittelemään niitä oikein. Seuraavassa on joitain yleisiä virheitä, joita voi tapahtua tiedostojen käsittelyn aikana:

Tiedoston avaamisvirhe

Saattaa olla tapauksia, joissa tiedostoa ei avata useista syistä, kuten sen puuttumisesta tai ohjelmalla ei ole lupaa avata sitä jne. Tässä tapauksessa voimme käyttää is_open() tiedostovirtaluokkien jäsentoiminto tarkistaaksesi, onko tiedosto avattu onnistuneesti vai ei.

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


Lähtö

Error: Unable to open file!

Tietojen lukemisen/kirjoituksen epäonnistuminen

Toinen yleinen virhe on epäonnistuminen tietojen lukemisessa tai kirjoittamisessa esimerkiksi virheellisestä tilasta jne. Tässä tapauksessa voimme vahvistaa toiminnot jokaisen luku-/kirjoitusyrityksen jälkeen. Esimerkiksi lukeminen käyttämällä getline() voidaan vahvistaa seuraavasti:

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


Lähtö

Error: Failed to read data

Tiedoston loppu (EOF) -virhe

Jos yrität lukea tiedoston lopun pidemmälle, se voi aiheuttaa EOF-virheen. Näin voi käydä, jos et tarkista tiedoston loppua ennen lukemista. Voimme tarkistaa EOF:n käyttämällä eof() jäsentoiminto.

reagoida sisäänrakennettu tyyli
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; } 


Lähtö

Reached end of file.

Huomaa, että olemme myös vahvistaneet lukutoiminnon ennen EOF as:n tarkistamista getline() tulee vain takaisin nullptr vaikka luku epäonnistuu jostain syystä.

Binääritiedostojen käsittely

Pystymme käsittelemään myös C++:ssa binääritiedostot jotka tallentavat tiedot raakamuodossa. Binääritietojen lukemiseen ja kirjoittamiseen on käytettävä ios::binääri lippu, kun luot/avaat binaaritiedostoa.

Kirjoita binaaritiedostoon

Jos haluat kirjoittaa tietoja binääritiedostoon, meidän on ensin avattava tai luotava tiedosto ios::binääri -tilassa.

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


Lähtö

kirjoittaa binaari' loading='lazy' title=Binääritiedosto

Lukeminen binaaritiedostosta

Aivan kuten avaamme tiedoston binääritilassa kirjoittaaksemme tietoja lukeaksemme tietoja binääritiedostosta, meidän on avattava tiedosto lukutilassa käyttämällä ios::in .

Syntaksi:

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


Lähtö

File Data: Welcome to GeeksForGeeks

Muut tiedostotoiminnot

Voimme myös tehdä enemmän toimintoja käsitelläksesi tiedostoa C++-ohjelmastamme. joitain yleisiä tiedostotoimintoja ovat:

  • C++-ohjelma tiedoston poistamiseen
  • Liitä merkkijono olemassa olevaan tiedostoon
  • Kopioi yksi tiedosto toiseen tiedostoon
Luo tietokilpailu