Руковање датотекама значи читање и писање у датотеке (као што је .ткт .цсв итд.) коришћењем класа које обезбеђује стандардна библиотека Ц++.
- Програми се покрећу у РАМ-у, што значи да подаци постоје само док је програм покренут када се програм заврши, сви подаци у РАМ-у се аутоматски губе.
- Руковање датотекама омогућава складиштење података у секундарној меморији (као што је ХДД или ССД) тако да се могу трајно сачувати и сачувати и приступити чак и након завршетка програма.
- За операције са датотекама Ц++ обезбеђује класе токова датотека у
заглавље као што је офстреам ифстреам фстреам.
Отварање датотеке
Пре читања из датотеке или писања у датотеку, прво морамо да је отворимо. Отварање датотеке учитава ту датотеку у РАМ. У Ц++ отварамо датотеку тако што креирамо ток до ње користећи фстреам класе које представљају ток датотеке, односно ток за унос и излаз у датотеку.
C++fstream str('filename.ext' mode);
где
- стр: Име дато току
- име датотеке: Назив датотеке
- режим : Представља начин на који ћемо ступити у интеракцију са датотеком.
Режими отварања датотека
Режим отварања датотеке означава да је датотека отворена за читање, писање или додавање. Испод је листа свих режима датотека у Ц++:
| Моде | Опис |
|---|---|
| иос::ин | Отворена датотека за читање. Ако датотека не постоји, операција отварања не успева. |
| иос::оут | Датотека отворена за писање: интерни бафер тока подржава излазне операције. |
| иос::бинари | Операције се изводе у бинарном режиму, а не у тексту. |
| иос::ате | Излазна позиција почиње на крају датотеке. |
| иос::апп | Све излазне операције се дешавају на крају датотеке и додаје се њеном постојећем садржају. |
| иос::трунк | Сав садржај који је постојао у датотеци пре отварања се одбацује. |
На пример ако желимо да отворимо датотеку за читање користимо следећи режим отварања:
C++fstream filein('file.txt' ios::in);
Слично, ако желимо да отворимо датотеку за писање, користимо следеће:
карактер у стринг у ЈавиC++
fstream fileout('file.txt' ios::out);
Ови режими се такође могу комбиновати коришћењем ОР оператора (|). На пример, можете отворити ток датотеке у режиму читања и писања као што је приказано:
C++fstream str('file.txt' ios::in | ios::out);
Ако датотека отворена у режиму писања не постоји, креира се нова датотека. Али ако датотека отворена у режиму читања не постоји, онда се не креира нова датотека и избацује се изузетак
Други токови датотека
фстреам није једини ток датотека који пружа Ц++. Постоје још два специјализована тока:
- ифстреам : Означава ток улазне датотеке. То је еквивалентно отварању фстреам-а иос::ин режим.
- офстреам : Означава ток излазне датотеке. То је еквивалентно отварању фстреам-а у иос::оут режим.
Горе наведени режими су подразумевани режими за ове токове. Ови режими се не могу мењати, али се могу спојити заједно са другим режимима. Сада за унос можемо користити и ифстреам као што је приказано:
C++ifstream filein('file.txt');
Слично за излаз:
C++ofstream fileout('file.txt');
Упишите податке у датотеку
Када се датотека отвори у режиму писања помоћу било које фстреам или офстреам можемо да извршимо операцију писања на сличан начин као код коришћења цоут-а << 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; }
ГФГ.тектЧитање података из датотеке
Када се датотека отвори у режиму читања користећи фстреам или ифстреам, можемо извршити операцију писања на сличан начин као са цин користећи >> оператер.
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; }
Излаз
Read String: WelcomeОво има исти проблем као и цин. Унос се узима само до првог знака размака. Да бисмо то избегли, можемо користити гетлине() функција као што је приказано:
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; }
Излаз
Read String: Welcome to GeeksforGeeks.Затварање датотеке
Затварање датотеке значи затварање повезаног тока и ослобађање ресурса које користимо. Важно је да затворите датотеку након што завршите са њом, посебно у дуготрајним програмима да бисте избегли губитак меморије, губитак података итд.
У Ц++ датотеке се затварају помоћу затвори() функција члана која је присутна у свим токовима датотека.
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; }
Излаз
Read String: Welcome to GeeksforGeeks.Грешке у руковању датотекама
Много различитих типова грешака може да се јави у руковању датотекама, као што је датотека која није пронађена, диск је пун итд. Наши програми би требало да очекују уобичајене грешке и требало би да буду у стању да их правилно рукују. Следе неке уобичајене грешке које се могу јавити током руковања датотекама:
Неуспешно отварање датотеке
Могу постојати случајеви у којима се датотека не отвара из разних разлога као што је да не постоји или програм нема дозволу да је отвори итд. У овом случају можемо користити ис_опен() функција члана класа тока датотека да провери да ли је датотека успешно отворена или не.
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; }
Излаз
Error: Unable to open file!Неуспех читања/писања података
Још једна уобичајена грешка је неуспех читања или писања података из разлога као што је нетачан режим итд. У овом случају можемо потврдити операције након сваког покушаја читања/писања. На пример, читање помоћу гетлине() може се потврдити на следећи начин:
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; }
Излаз
Error: Failed to read dataГрешка на крају датотеке (ЕОФ).
Покушај читања даље од краја датотеке може изазвати ЕОФ грешку. Ово се може десити када не проверите да ли је крај датотеке пре читања. Можемо да проверимо да ли користимо ЕОФ еоф() функција члана.
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; }
Излаз
Reached end of file.Приметите да смо такође потврдили операцију читања пре провере ЕОФ као гетлине() само ће се вратити нуллптр чак и ако читање не успе из било ког разлога.
Руковање бинарним датотекама
У Ц++ такође можемо да обрадимо бинарне датотеке који чувају податке у сировом формату. За читање и писање бинарних података морате користити иос::бинари заставицу приликом креирања/отварања бинарне датотеке.
Упишите у бинарну датотеку
Да бисмо записали податке у бинарну датотеку, прво морамо да отворимо или креирамо датотеку у њој иос::бинари режим.
цео број у низ у Јави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; }
Излаз
Бинарна датотекаЧитање из бинарне датотеке
Баш као што отварамо датотеку у бинарном режиму да бисмо уписали податке за читање података из бинарне датотеке, морамо отворити датотеку у режиму читања користећи иос::ин .
Синтакса:
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; }
Излаз
File Data: Welcome to GeeksForGeeksДруге операције са датотекама
Такође можемо да урадимо више операција да манипулишемо датотеком из нашег Ц++ програма. неке од уобичајених операција са датотекама су:
Креирај квиз
- Ц++ програм за брисање датотеке
- Додајте стринг у постојећу датотеку
- Копирајте једну датотеку у другу датотеку