fstream

C++ fstream sinfi

❮ fstream sinflari


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
int
long
short
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
+125
 -30
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
   1
 +01
float
double
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
-5.46
+2e4
-1.62E-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
string
char *
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;

❮ fstream sinflari

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!