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 tiedostovirtaluokkia
otsikko, 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::in | Tiedosto auki lukemista varten. Jos tiedostoa ei ole olemassa, avaaminen epäonnistuu. |
| ios::out | Tiedosto auki kirjoittamista varten: sisäinen stream-puskuri tukee tulostustoimintoja. |
| ios::binääri | Toiminnot suoritetaan binääritilassa tekstin sijaan. |
| ios::ate | Tulostuskohta alkaa tiedoston lopusta. |
| ios::app | Kaikki tulostustoiminnot tapahtuvat tiedoston lopussa ja liitetään sen olemassa olevaan sisältöön. |
| ios::runko | Kaikki 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 nauhaanC++
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; }
GFG.textLue 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: WelcomeTä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 dataTiedoston 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 tyyliC++
#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ö
BinääritiedostoLukeminen 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 GeeksForGeeksMuut tiedostotoiminnot
Voimme myös tehdä enemmän toimintoja käsitelläksesi tiedostoa C++-ohjelmastamme. joitain yleisiä tiedostotoimintoja ovat:
Luo tietokilpailu
- C++-ohjelma tiedoston poistamiseen
- Liitä merkkijono olemassa olevaan tiedostoon
- Kopioi yksi tiedosto toiseen tiedostoon