fstream
C++ fstream sinfi
Misol
Fayldan o‘qish va unga yozish uchun fstream sinfidan foydalaning:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// Create and open a text file
fstream MyFile("filename.txt");
// Write to the file
MyFile << "Files can be tricky, but it is fun enough!";
// Read from the file
string myText;
getline(MyFile, myText);
cout << myText;
// Close the file
MyFile.close();
}
Ta’rif va qo‘llanilishi
fstream sinfi ("file stream" — fayl oqimi so‘zlarining qisqartmasi) fayllardan o‘qish va ularga yozish uchun ishlatiladi.
fstream sinfi <fstream> sarlavha faylida aniqlangan.
Faylni ochish uchun fayl yo‘lini konstruktorga uzating:
fstream MyFile("filename.txt");
fstream sinfida fayllardan o‘qish va ularga yozish uchun turli funksiyalar mavjud, ular quyida keltirilgan.
Fayl ko‘rsatkichi funksiyalari
Fayl ko‘rsatkichlari — faylning qayeridan o‘qish yoki qayeriga yozishni bildiruvchi ichki o‘zgaruvchilar.
Fayl ko‘rsatkichi funksiyalari fayl ko‘rsatkichlarini boshqarish uchun ishlatiladi. O‘qish fayl ko‘rsatkichi uchun ham, yozish fayl ko‘rsatkichi uchun ham funksiyalar mavjud, lekin fstream sinfi ikkala amal uchun bitta ko‘rsatkichdan foydalanadi, shuning uchun ulardan birini o‘zgartirish ikkinchisini ham o‘zgartiradi.
seekg()
seekg(position) metodi o‘qish fayl ko‘rsatkichini fayl boshiga nisbatan belgilangan pozitsiyaga o‘tkazadi.
MyFile.seekg(6)
seekg(position, origin) metodi o‘qish fayl ko‘rsatkichini fayldagi origin nuqtasiga nisbatan belgilangan position pozitsiyasiga o‘tkazadi. Boshlang‘ich nuqta (origin) uchta qiymatdan birini olishi mumkin:
fstream::beg- Pozitsiya fayl boshiga nisbatan olinadi.fstream::cur- Pozitsiya fayldagi joriy pozitsiyaga nisbatan olinadi.fstream::end- Pozitsiya fayl oxiriga nisbatan olinadi.
O‘qish fayl ko‘rsatkichini turli pozitsiyalarga o‘tkazing:
MyFile.seekg(6, fstream::beg);
cout << MyFile.tellg() << "\n";
MyFile.seekg(-3, fstream::cur);
cout << MyFile.tellg() << "\n";
MyFile.seekg(-4, fstream::end);
cout << MyFile.tellg() << "\n";
tellg()
tellg() metodi fayl ko‘rsatkichining fayldagi joriy pozitsiyasini qaytaradi.
cout << MyFile.tellg();
seekp()
seekp(position) metodi yozish fayl ko‘rsatkichini fayl boshiga nisbatan belgilangan pozitsiyaga o‘tkazadi.
MyFile.seekp(6)
seekp(position, origin) metodi yozish fayl ko‘rsatkichini fayldagi origin nuqtasiga nisbatan belgilangan position pozitsiyasiga o‘tkazadi. Boshlang‘ich nuqta (origin) uchta qiymatdan birini olishi mumkin:
fstream::beg- Pozitsiya fayl boshiga nisbatan olinadi.fstream::cur- Pozitsiya fayldagi joriy pozitsiyaga nisbatan olinadi.fstream::end- Pozitsiya fayl oxiriga nisbatan olinadi.
Yozish fayl ko‘rsatkichini turli pozitsiyalarga o‘tkazing:
MyFile.seekp(6, fstream::beg);
cout << MyFile.tellp() << "\n";
MyFile.seekp(-3, fstream::cur);
cout << MyFile.tellp() << "\n";
MyFile.seekp(-4, fstream::end);
cout << MyFile.tellp() << "\n";
tellp()
tellp() metodi yozish fayl ko‘rsatkichining fayldagi joriy pozitsiyasini qaytaradi.
cout << MyFile.tellp();
Fayldan o‘qish funksiyalari
Fayldan o‘qish funksiyalari fayldan belgilarni ajratib oladi va fayl ko‘rsatkichini siljitadi.
get()
get() metodi fayldan bitta belgini o‘qiydi va uning ASCII qiymatini int qiymat sifatida qaytaradi. Belgini ko‘rish uchun uni char tipiga o‘tkazing. Fayl ko‘rsatkichi fayldagi keyingi belgiga o‘tadi.
char myChar = MyFile.get();
cout << myChar;
get(destination, size, delimiter) metodi fayldan o‘qilgan ma’lumotlardan ko‘pi bilan size ta belgini manzilga (destination) yozadi. U qator ko‘chishiga, fayl oxiriga yoki delimiter parametri orqali berilgan ixtiyoriy belgiga yetishi bilanoq o‘qishni to‘xtatadi. destination parametriga yozilgan qiymat har doim \0 null belgisi bilan tugaydi. Bu metod fayl ko‘rsatkichini o‘qish to‘xtagan qator ko‘chishi yoki ajratuvchi belgiga o‘tkazadi.
char destination[20];
MyFile.get(destination, 20);
cout << destination << "\n";
// Stop reading when a '.' is found
MyFile.get(destination, 20, '.');
cout << destination << "\n";
getline()
getline(destination, size, delimiter) metodi get(destination, size, delimiter) metodi bilan bir xil, faqat qator ko‘chishi yoki ajratuvchi belgi tashlab yuboriladi va fayl ko‘rsatkichi undan keyingi belgiga o‘tkaziladi.
char destination[20];
MyFile.getline(destination, 20);
cout << destination << "\n";
// Stop reading when a '.' is found
MyFile.getline(destination, 20, '.');
cout << destination << "\n";
Shunga o‘xshash getline(stream, destination, delimiter) funksiyasi ham bor: u stream parametridagi fstream obyekti ko‘rsatgan fayldan keyingi qator ko‘chishigacha (yoki ixtiyoriy delimiter belgisigacha) bo‘lgan barcha belgilarni o‘qiydi va ularni destination ko‘rsatgan stringga yozadi.
string destination;
getline(MyFile, destination);
cout << destination << "\n";
// Stop reading when a '.' is found
getline(MyFile, destination, '.');
cout << destination << "\n";
read()
read(destination, n) metodi fayldan n ta belgini o‘qiydi va ularni destination parametri ko‘rsatgan char massiviga yozadi. Boshqa funksiyalardan farqli o‘laroq, u qator ko‘chishlarida o‘qishni to‘xtatmaydi va ma’lumotlarga null belgisini qo‘shmaydi.
char destination[20];
MyFile.read(destination, 19);
destination[20] = '\0'; // Make sure it ends with a null terminating character
cout << destination << "\n";
peek()
peek() metodi fayldan bitta belgini o‘qiydi va uning ASCII qiymatini int qiymat sifatida qaytaradi. Belgini ko‘rish uchun uni char tipiga o‘tkazing. get() metodidan farqli o‘laroq, bu metod fayl ko‘rsatkichini siljitmaydi.
char myChar = MyFile.peek();
cout << myChar;
gcount()
gcount() metodi eng so‘nggi chaqirilgan fayldan o‘qish metodi fayldan ajratib olgan belgilar sonini qaytaradi.
char destination[20];
MyFile.getline(destination, 20);
cout << MyFile.gcount() << "\n";
Faylga yozish funksiyalari
Faylga yozish funksiyalari faylga ma’lumot yozadi va fayl ko‘rsatkichini yozilgan tarkibdan keyingi birinchi pozitsiyaga o‘tkazadi.
write()
write(str, n) metodi char tipidagi str massividan n ta belgini faylga yozadi va fayl ko‘rsatkichini n ta belgi oldinga siljitadi.
char myStr[] = "Hello World!";
MyFile.write(myStr, 5);
put()
put(c) metodi ko‘rsatilgan c belgisini faylga yozadi va fayl ko‘rsatkichini bir belgi oldinga siljitadi.
char grade = 'B';
MyFile.put(grade);
Fayllar bilan ishlash funksiyalari
Fayllar bilan ishlash funksiyalari fayllarni ochadi va yopadi.
open()
open(filepath) metodi filepath ko‘rsatgan yo‘ldagi faylni ochadi. Agar fayl allaqachon ochiq bo‘lsa, bu metod hech qanday ta’sir ko‘rsatmaydi.
ofstream MyFile;
MyFile.open("filename.txt");
is_open()
is_open() metodi fayl ochiq bo‘lsa true, hech qanday fayl ochiq bo‘lmasa false qaytaradi.
fstream MyFile;
cout << MyFile.is_open(); << "\n"; // Displays 0 because the file is not open
MyFile.open("filename.txt");
cout << MyFile.is_open(); << "\n"; // Displays 1 because the file is open
close()
close() metodi faylni yopadi. Resurslarni bo‘shatish uchun fayl bilan ishlashni tugatgach, uni yopib qo‘ygan ma’qul.
MyFile.close();
rdbuf()
rdbuf() metodi fayl bilan bevosita ishlaydigan ichki filebuf obyektiga ko‘rsatkich qaytaradi.
filebuf * buf = MyFile.rdbuf();
Ajratib olish (extraction) operatori
>> ajratib olish operatori fayldagi joriy pozitsiyadan bir nechta belgini o‘qiydi, ularni talqin qiladi va talqin qilingan qiymatni o‘zgaruvchiga yozadi. So‘ngra fayl ko‘rsatkichi hali o‘qilmagan keyingi belgiga o‘tkaziladi. Belgilarning qanday talqin qilinishi o‘zgaruvchining ma’lumot tipiga bog‘liq.
Sintaksis
MyFile >> variable
Faylning qismlarini birin-ketin o‘qish uchun undan bir necha marta foydalanish ham mumkin.
MyFile >> variable1 >> variable2 >> variable3
>> ajratib olish operatori avval bo‘shliq belgilarini (bo‘sh joylar, tabulyatsiyalar va qator ko‘chishlari) bo‘shliq bo‘lmagan birinchi belgiga yetguncha o‘tkazib yuboradi. Shundan so‘ng u o‘zgaruvchining ma’lumot tipiga qarab quyidagi jadvalda ko‘rsatilgan qoidalarga amal qiladi.
| Ma’lumot tipi | Tavsif | Misollar |
|---|---|---|
intlongshort
|
Raqamlar ketma-ketligini o‘qiydi va uni butun son sifatida talqin qiladi. Ketma-ketlik oldidan ishora ("+" yoki "-") kelishi mumkin. U raqam bo‘lmagan birinchi belgida o‘qishni to‘xtatadi. Agar to‘g‘ri ketma-ketlik topilmasa, ifstream obyekti xato holatiga o‘tadi va keyingi o‘qishni to‘xtatadi. |
15 |
bool |
Butun sonni yuqorida tavsiflangan usulda o‘qiydi, so‘ngra 0 ni false, 1 ni esa true deb talqin qiladi. Boshqa har qanday butun son true deb talqin qilinadi, lekin ifstream obyekti xato holatiga o‘tadi va keyingi o‘qishni to‘xtatadi.Keyingi bo‘limda tavsiflangan boolalpha manipulyatori bu xatti-harakatni butunlay o‘zgartiradi. |
0 |
floatdouble
|
To‘g‘ri belgilar ketma-ketligini o‘qiydi va uni suzuvchi nuqtali son sifatida talqin qiladi. To‘g‘ri ketma-ketlikda kamida bitta raqam bo‘ladi, uning oldidan ishora ("+" yoki "-"), ortidan esa o‘nlik nuqta va kasr raqamlari kelishi mumkin. Ilmiy yozuvdan (son, undan keyin "e" yoki "E" va bir nechta raqam) ham foydalanish mumkin. Agar to‘g‘ri ketma-ketlik topilmasa, fstream obyekti xato holatiga o‘tadi va keyingi o‘qishni to‘xtatadi. |
5 |
char
|
Fayldan bitta belgini o‘qiydi. Agar fayl ko‘rsatkichi fayl oxirida bo‘lsa, fstream obyekti xato holatiga o‘tadi va keyingi o‘qishni to‘xtatadi. |
B |
stringchar *
|
Keyingi bo‘shliq belgisi (bo‘sh joy, tabulyatsiya yoki qator ko‘chishi), null belgisi yoki fayl oxirigacha bo‘lgan barcha belgilarni o‘qiydi. O‘zgaruvchi qiymatiga \0 null belgisi qo‘shiladi.Agar fayl ko‘rsatkichi allaqachon null belgisida yoki fayl oxirida turgan bo‘lsa, fstream obyekti xato holatiga o‘tadi va keyingi o‘qishni to‘xtatadi. |
Hello |
Manipulyatorlar
O‘zgaruvchi o‘rnida manipulyatordan foydalanish mumkin. Manipulyatorlar ishlatilganda ular fstream obyekti ma’lumotlarni qanday talqin qilishini o‘zgartiradi. Manipulyatorning ta’siri uni boshqa manipulyator o‘zgartirmaguncha saqlanib qoladi.
Quyidagi jadvalda >> ajratib olish operatori bilan ishlatilishi mumkin bo‘lgan manipulyatorlar ro‘yxati keltirilgan.
| Manipulyator | Tavsif |
|---|---|
noskipws |
>> ajratib olish operatori bo‘shliq belgilarini o‘tkazib yuborish o‘rniga ularni o‘qiydi. Bu asosan char tipidagi o‘zgaruvchilar uchun foydali, chunki boshqa ma’lumot tiplarida u bo‘shliq belgisiga duch kelganda o‘qishni to‘xtatadi. |
skipws |
noskipws manipulyatori kiritgan o‘zgarishni bekor qiladi. |
ws |
Fayl ko‘rsatkichini fayldagi bo‘shliq belgisi bo‘lmagan keyingi pozitsiyaga o‘tkazadi. |
hex |
Butun sonli o‘zgaruvchilar ishlatilganda sonlarning o‘n oltilik ko‘rinishi (0 dan 9 gacha raqamlar va A dan F gacha harflar) kutiladi. |
oct |
Butun sonli o‘zgaruvchilar ishlatilganda sonlarning sakkizlik ko‘rinishi (0 dan 7 gacha raqamlar) kutiladi. |
dec |
Butun sonli o‘zgaruvchilar ishlatilganda sonlarning o‘nlik ko‘rinishi (0 dan 9 gacha raqamlar) kutiladi. Bu hex va oct manipulyatorlari kiritgan o‘zgarishni bekor qiladi. |
boolalpha |
Boolean o‘zgaruvchi uchun ma’lumot o‘qilayotganda butun son o‘rniga "true" yoki "false" belgilar ketma-ketligini qidiradi. |
noboolalpha |
boolalpha manipulyatori kiritgan o‘zgarishni bekor qiladi. |
Misol
Ma’lumotlar qanday talqin qilinishini o‘zgartirish uchun manipulyatorlardan foydalaning:
bool myBool;
int myInt;
// Interpret character sequences "true" and "false" as boolean values
MyFile >> boolalpha >> myBool;
// Revert to reading booleans normally
MyFile >> noboolalpha;
// Read hexadecimal numbers from the file and interpret them as integers
MyFile >> hex >> myInt;
// Revert to reading integers normally
MyFile >> dec;
Joylash (insertion) operatori
<< joylash operatori faylga literal qiymatni yoki o‘zgaruvchi tarkibini yozadi.
int year = 2024;
MyFile << year << "\n";
MyFile << "Files can be tricky, but it is fun enough!";
Manipulyatorlar
Manipulyatorlar faylga yoziladigan ma’lumotlarning formatini o‘zgartiradi. Ular << joylash operatori bilan literal qiymatlar va o‘zgaruvchilar kabi ishlatiladi.
setw() manipulyatoridan tashqari, manipulyatorning ta’siri uni boshqa manipulyator o‘zgartirmaguncha saqlanib qoladi.
Quyidagi jadvalda foydali manipulyatorlar ro‘yxati keltirilgan:
| Manipulyator | Tavsif | Misol |
|---|---|---|
boolalpha |
Boolean qiymatlarni "1" va "0" o‘rniga "true" va "false" ko‘rinishida yozadi. | MyFile << boolalpha << false; |
dec |
Butun sonlarni o‘nlik raqamlar bilan ifodalaydi. | MyFile << dec << 12; |
endl |
Yangi qator belgisini yozadi. Bu manipulyator chiqish buferini ham bo‘shatadi (flush), shu sababli u \n belgisini chop etishga qaraganda kamroq samarali. |
MyFile << "Line 1" << endl << "Line 2"; |
ends |
C uslubidagi stringlarni yakunlash uchun ishlatiladigan \0 null belgisini yozadi. |
MyFile << "Hello World!" << ends; |
fixed |
Suzuvchi nuqtali sonlarni kasr qismidagi raqamlar soni qat’iy belgilangan holda ifodalaydi. Kasr qismidagi raqamlar sonini setprecision() manipulyatori yordamida belgilash mumkin. |
MyFile << fixed << 19.99; |
hex |
Butun sonlarni o‘n oltilik raqamlar bilan ifodalaydi. | MyFile << hex << 12; |
internal |
Agar kenglik belgilangan bo‘lsa (setw() manipulyatori yordamida), sonlarning ishorasi chapga, qiymati esa o‘ngga tekislanadi, boshqa ma’lumot tiplarida esa natija o‘ngga tekislanadi. |
MyFile << setw(10) << internal << -12345; |
left |
Agar kenglik belgilangan bo‘lsa (setw() manipulyatori yordamida), natijani chapga tekislaydi. |
MyFile << setw(10) << left << "Hello"; |
noboolalpha |
boolalpha manipulyatori kiritgan o‘zgarishni bekor qilish uchun ishlatiladi. |
MyFile << noboolalpha << false; |
noshowbase |
showbase manipulyatori kiritgan o‘zgarishni bekor qilish uchun ishlatiladi. |
MyFile << hex << noshowbase << 12; |
noshowpoint |
showpoint manipulyatori kiritgan o‘zgarishni bekor qilish uchun ishlatiladi. |
MyFile << noshowpoint << 12345.0; |
noshowpos |
showpos manipulyatori kiritgan o‘zgarishni bekor qilish uchun ishlatiladi. |
MyFile << noshowpos << 12; |
nouppercase |
uppercase manipulyatori kiritgan o‘zgarishni bekor qilish uchun ishlatiladi. |
MyFile << hex << nouppercase << 12; |
oct |
Butun sonlarni sakkizlik raqamlar bilan ifodalaydi. | MyFile << oct << 12; |
right |
Agar kenglik belgilangan bo‘lsa (setw() manipulyatori yordamida), natijani o‘ngga tekislaydi. |
MyFile << setw(10) << right << "Hello"; |
scientific |
Suzuvchi nuqtali sonlarni ilmiy yozuvda ifodalaydi. Kasr qismidagi raqamlar sonini setprecision() manipulyatori yordamida belgilash mumkin. |
MyFile << fixed << 19.99; |
setfill() |
To‘ldiruvchi sifatida ishlatiladigan belgini tanlaydi. <iomanip> kutubxonasi kerak bo‘ladi. |
MyFile << setfill('.') << setw(10) << 19.99; |
setprecision() |
Suzuvchi nuqtali sonlarning aniqligini tanlaydi. Agar fixed yoki scientific manipulyatorlari ishlatilgan bo‘lsa, u kasr qismidagi raqamlar sonini, aks holda qiymatli raqamlar sonini belgilaydi. <iomanip> kutubxonasi kerak bo‘ladi. |
MyFile << setprecision(4) << 12.3456; |
setw() |
Keyingi chiqariladigan natijaning belgilarda o‘lchanadigan eng kam kengligini belgilaydi. Agar natija yetarlicha keng bo‘lmasa, qolgan joyni to‘ldirish uchun to‘ldiruvchi belgilar qo‘shiladi. <iomanip> kutubxonasi kerak bo‘ladi. |
MyFile << setw(10) << "Hello"; |
showbase |
Butun sonlarni o‘n oltilik yoki sakkizlik ko‘rinishda ifodalashda sanoq sistemasini ko‘rsatish uchun sonlar oldiga "0x" yoki "0" qo‘yadi. | MyFile << hex << showbase << 12; |
showpoint |
Suzuvchi nuqtali sonlarda o‘nlik nuqtani, hatto u kerak bo‘lmasa ham, har doim yozadi. | MyFile << showpoint << 12345.0; |
showpos |
Musbat sonlar yonida har doim + belgisini yozadi. | MyFile << showpos << 12; |
uppercase |
O‘n oltilik raqamlarni va ilmiy yozuvdagi "e" harfini katta harfda ifodalaydi. | MyFile << hex << uppercase << 12; |
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
