73 / 90

C++ File Handling

C++ fayllar bilan ishlash

C++ tilida fayllar bilan ishlash - bu faylda o'qish/yozish amallarini yaratish va bajarish mexanizmi.

<fstream> sinfini import qilish orqali biz C++ da turli xil fayllar bilan ishlash usullariga kirishimiz mumkin.

example.cpp
#include <fstream>

<fstream> includes two classes for file handling:

  • ifstream - to read from a file.
  • ofstream - to create/open and write to a file.

[!NOTE] Bizning onlayn kompilyatorimiz hozirda fayllar bilan ishlashni boshqara olmaydi. Shunday qilib, bu erda keltirilgan dasturlarni ishga tushirish uchun kompyuteringizga IDE yoki matn muharririni o'rnating.

Faylni ochish va yopish

Fayllar bilan ishlash uchun avvalo ularni ochishimiz kerak. C++ da faylni ofstream va ifstream sinflari yordamida ochishimiz mumkin.

Masalan, ofstream yordamida faylni qanday ochishimiz mumkin:

example.cpp
std::ofstream my_file("example.txt");

Bu yerga,

-my_file - ofstream sinfi ob'ektining nomi. -example.txt - biz ochmoqchi bo'lgan faylning nomi va kengaytmasi.

[!NOTE] Faylni ochish uchun open() funksiyasidan ham foydalanishimiz mumkin. Masalan, std::ofstream my_file.open("example.txt");

Faylni yopish

Fayl bilan ishlashni tugatgandan so'ng, biz uni close() funksiyasidan foydalanib yopishimiz kerak.

example.cpp
my_file.close();

Ushbu operatsiyalarni ko'rib chiqish uchun dastur misolini olaylik.

1-misol: Faylni ochish va yopish

example.cpp
#include <iostream>
#include <fstream>

using namespace std; 

int main() {

    // yozish uchun matn faylini ochish
    ofstream my_file("example.txt");

    // faylni yoping
    my_file.close();

    return 0;
}

Ushbu kod example.txt faylini ochadi va yopadi.

[!NOTE] If there's no such file to open, ofstream my_file("example.txt"); will instead create a new file named example.txt.

Faylni xatolar uchun tekshiring

Fayllarni qayta ishlashda fayl ustida boshqa amallarni bajarishdan oldin uning xatosiz ochilganligiga ishonch hosil qilish muhimdir.Fayllarda xatoliklarni tekshirishning uchta umumiy usuli mavjud:

  1. Fayl obyektini tekshirish orqali
example.cpp
ofstream my_file("example.txt");

// fayl to'g'ri ochilganligini tekshiring
if (!my_file) {

    // chop etish xato xabari
    cout << "Error opening the file." << endl;

    // main() funksiyasini tugatish
    return 1;
}

if operatoridagi shartga e'tibor bering:

example.cpp
if (!my_file) {...}

Ushbu usul fayl ob'ektining o'zini baholash orqali fayl xato holatida yoki yo'qligini tekshiradi.

  • Agar fayl muvaffaqiyatli ochilgan bo'lsa, shart true ga baholanadi.
  • Agar xato bo'lsa, u false ga baholanadi va siz xatoni shunga mos ravishda hal qilishingiz mumkin.
  1. is_open() funksiyasidan foydalanish

is_open() funksiyasi qaytadi

  • rost - agar fayl muvaffaqiyatli ochilgan bo'lsa.
  • noto'g'ri - agar fayl ochilmasa yoki xatolik holatida bo'lsa.

Masalan,

example.cpp
ofstream my_file("example.txt");

if (!my_file.is_open()) {
    cout << "Error opening the file." << endl;
    return 1;
}
  1. fail() funksiyasidan foydalanish

fail() funksiyasi qaytadi

  • rost - agar fayl ochilmasa yoki xatolik holatida bo'lsa.
  • noto'g'ri - agar fayl muvaffaqiyatli ochilgan bo'lsa.
example.cpp
ofstream my_file("example.txt");

if (my_file.fail()) {
    cout << "Error opening the file." << endl;
    return 1;
}

[!NOTE] Oddiylik uchun birinchi usuldan foydalanishni tavsiya etamiz.

Fayldan o'qish

Matnli fayllardan o'qish faylni ifstream sinfi yordamida ochish orqali amalga oshiriladi. Masalan,

example.cpp
ifstream my_file("example.txt");

Keyin, biz faylni satrga o'qishimiz kerak. Buni amalga oshirish uchun biz faylning har bir satri bo'ylab barcha satrlar o'qilmaguncha, ya'ni faylning oxiriga yetguncha aylanishimiz kerak.

Biz bu maqsadda eof() funksiyasidan foydalanamiz, bu esa qaytaradi

  • rost - agar fayl ko'rsatkichi faylning oxiriga ishora qilsa
  • noto'g'ri - agar fayl ko'rsatkichi faylning oxiriga ishora qilmasa

Masalan,

example.cpp
// fayl mazmunini saqlash uchun o'zgaruvchi
string line;

// faylning oxirigacha sikl
while (!my_file.eof()) {

    // faylning joriy qatorini saqlang
    // "chiziq" o'zgaruvchisida
    getline(my_file, line);

    // chiziq o'zgaruvchisini chop eting
    cout << line << endl;
}

Bu erda while sikli faylning oxirigacha ishlaydi. Loopning har bir iteratsiyasida,

-getline(my_file, line); faylning joriy satrini o'qiydi va uni satr o'zgaruvchisida saqlaydi.

  • Keyin u chiziq o'zgaruvchisini chop etadi.

Keyinchalik, buni ishlaydigan misol bilan aniqlab olaylik.

2-misol: Fayldan o'qish

example.cpp
#include <iostream>
#include <fstream>

using namespace std; 

int main() {

    // o'qish uchun matn faylini oching
    ifstream my_file("example.txt");

    // faylni xatolar uchun tekshiring
    if(!my_file) {
        cout << "Error: Unable to open the file." << endl;
        return 1; 
    }

    // fayl mazmunini "satr" qatorida saqlang
    string line;

    // matn faylining oxirigacha sikl
    while (!my_file.eof()) {

        // faylning joriy qatorini saqlang
        // "chiziq" o'zgaruvchisida
        getline(my_file, line);

        // chiziq o'zgaruvchisini chop eting
        cout << line << endl;
    }

    // faylni yoping
    my_file.close();

    return 0;
}

example.txt quyidagi matnni o'z ichiga oladi deylik:

Contents of example.txt

Contents of example.txt

Keyin terminalimiz quyidagi chiqishni chop etadi:

kod
Hello, World!
How are you?

Faylga yozish

Biz faylga yozish uchun ofstream sinfidan foydalanamiz. Masalan,

example.cpp
ofstream my_file("example.txt");

Keyin faylga << kiritish operatoridan foydalanib, ofstream my_file obyekti bilan yozishimiz mumkin. Masalan,

example.cpp
#include <iostream>
#include <fstream>

using namespace std;

int main() {

    // yozish uchun matn faylini oching
    ofstream my_file("example.txt");

    // faylni xatolar uchun tekshiring
    if(!my_file) {
        cout << "Error: Unable to open the file." << endl;
        return 1; 
    }

    // faylga bir nechta qatorlarni yozing
    my_file << "Line 1" << endl;
    my_file << "Line 2" << endl;
    my_file << "Line 3" << endl;

    // faylni yoping
    my_file.close();

    return 0;
}

Faylga yozish uchun quyidagi kodga e'tibor bering:

example.cpp
my_file << "Line 1" << endl;
my_file << "Line 2" << endl;
my_file << "Line 3" << endl;

Bu ekranga chop etish chiqishiga o'xshaydi:

example.cpp
cout << "Line1" << endl;

Fayllarni qayta ishlashda biz konsol o'rniga faylga yozish uchun cout ni fayl obyekti bilan almashtiramiz.

Bizning maxsus kodimiz example.txt ga quyidagi matnni yozadi:

kod
Line1
Line2
Line3

[!NOTE] Mavjud faylga yozish faylning mavjud mazmunini qayta yozadi.

Matn fayliga qo'shish

Faylning mavjud tarkibiga qo'shish/qo'shish uchun faylni qo'shish rejimida ochishingiz kerak.

C++ da faylni ochishda ios::app bayrog'i yordamida bunga erishishingiz mumkin:

example.cpp
ofstream my_file("example.txt", ios::app);

Keling, example.txt ning mavjud tarkibiga yana bir nechta matn qo'shamiz:

example.cpp
#include <iostream>
#include <fstream>

using namespace std;

int main() {

    // qo'shish uchun matn faylini oching
    ofstream my_file("example.txt", ios::app);

    // agar fayl muvaffaqiyatli ochilmasa, xato xabarini chop eting
    if(!my_file) {
        cout << "Failed to open the file for appending." << endl;
        return 1;  
    }

    // faylga bir nechta qatorlarni qo'shing
    my_file << "Line 4" << endl;
    my_file << "Line 5" << endl;
    my_file << "Line 6" << endl;

    // faylni yoping
    my_file.close();

    return 0;
}

Bu example.txt ga quyidagi qatorlarni qo'shadi:

kod
Line 4
Line 5
Line 6

Contents Appended to an Existing File

Contents Appended to an Existing File

Fstream yordamida fayllarni qayta ishlash

Fayldan o'qish uchun ifstream va faylga yozish uchun ofstream dan foydalanish o'rniga, biz barcha fayl operatsiyalari uchun fstream sinfidan foydalanishimiz mumkin.

fstream konstruktori fayl nomi va fayl operatsiyalari rejimini belgilash imkonini beradi.

Rejim tavsifi ios::in O'qish uchun faylni ochadi ( ifstream uchun standart). ios::out Yoziladigan faylni ochadi ( ofstream uchun standart). ios::app Faylni ochadi va oxirida unga yangi tarkib qo'shadi.

Keling, bir misolni ko'rib chiqaylik:

example.cpp
#include <iostream>
#include <fstream>

using namespace std;

int main() {

    // 1. matn fayliga yozish
    fstream my_file("example.txt", ios::out);

    if (my_file) {
        my_file << "This is a test line." << endl;
        my_file.close();
    }
    else {
        cout << "Unable to open file for writing." << endl;
        return 1;
    }

    // 2. xuddi shu fayldan o'qing
    string line;
    my_file.open("example.txt", ios::in);
    
    if (my_file) {
        while (!my_file.eof()) {
            getline(my_file, line);
            cout << "Read from file: " << line << endl;
        }
        my_file.close();
    }
    else {
        cout << "Unable to open file for reading." << endl;
        return 1;
    }

    // 3. fayl oxiriga ma'lumotlarni qo'shish
    my_file.open("example.txt", ios::app);

    if (my_file) {
        my_file << "This is another test line, appended to the file." << endl;
        my_file.close();
    }
    else {
        cout << "Unable to open file for appending." << endl;
        return 1;
    }

    return 0;
}

Chiqish

kod
Read from file: This is a test line.
Read from file:

Agar dasturni ishga tushirgandan so'ng faylni ko'rib chiqsak, biz quyidagi tarkibni topamiz:

File Handling Using fstream

File Handling Using fstream

[!NOTE] ifstream va ofstream dan foydalanish, mos ravishda o'qish yoki yozish niyatini aniq bildiradi, bu kodni yanada o'qilishi mumkin va xatolarga kamroq moyil bo'ladi. Ikkalasi uchun fstream dan foydalanish, agar ehtiyotkorlik bilan foydalanilmasa, noaniqlik yoki kutilmagan operatsiyalarga olib kelishi mumkin.