C++ ҳам дохилкунӣ аз файл ва ҳам хориҷкунӣ ба файлро ба воситаи синфҳои (classes) зерин таъмин мекунад:
-
ofstream. Синф барои сабти маълумот ба файл (дар асоси ostream сохта шудааст);
-
ifstream. Синф барои хондани маълумот аз файл (дар асоси istream сохта шудааст);
-
fstream. Синф барои амалҳои ҳам хондан ва ҳам сабти маълумот (дар асоси iostream сохта шудааст).
Файлро дар ҳолати иҷро шудани дохилкунӣ мо ҳамчун манбаъ тасаввур карда метавонем; манбае, ки аз он маълумоти ба мо даркорӣ ҷорӣ аст. Файлро дар ҳолати иҷро шудани хориҷкунӣ мо ҳамчун анбор тасаввур карда метавонем; анборе, ки ба он маълумоти ба мо даркорӣ ҷорӣ мешавад.
Рафти кор бо файл аз якчанд даврҳо иборат аст.
Кушодани файл. Якумин амале, ки аз болои объектҳо (намояндагон, нусхаҳо)-и ин синфҳо иҷро карда мешавад, ин мантиқан пайваст кардани ягон объект бо ягон файли воқеӣ мебошад, ки ин амалро кушодани файл меноманд. Яъне файли кушодашуда дар барнома бо ягон объект ифода карда мешавад, албатта бо кӯмаки яке аз синфҳои болоӣ. Ҳаргуна амали хориҷкунӣ ва ё дохилкуние, ки аз болои ин объект иҷро карда мешавад ба файли воқеӣ низ татбиқ карда мешавад.
Барои кушодани файл аз функсия-аъзои синфҳои болои функсияи open() истифода мебаранд:
void open(const char *filename, openmode);
Дар ин ҷо void нишони он аст, ки функсияи open ягон қимат боз намегардонад, filename - сатрест, ки дар он номи файл нишон дода мешавад, openmode - усули кушодани файл мебошад. openmode комбинатсияи қиматҳои зерин буда метавонад:
ios::in | Кушодани файл барои хондан |
---|---|
ios::out | Кушодани файл барои сабт кардан |
ios::ate | Кор бо файл аз охири он оғоз меёбад |
ios::app | Ҳар як хориҷкунӣ ба охири файл зам мешавад |
ios::trunc | Агар файл мавҷуд бошад, он тоза карда мешавад |
ios::binary | Реҷаи бинарӣ |
ios::nocreate | Файл кушода намешавад, агар он мавҷуд набошад |
ios::noreplace | Файл кушода намешавад, агар он мавҷуд бошад |
Комбинатсияҳои ин қиматҳо бо ёрии оператори битии OR ( | ) сохта мешаванд. Масалан, барои дар режими бинарӣ кушодани файли namuna.bin барои ба давоми он зам кардани маълумот, мо аз функсия-аъзои open() истифода мебарем:
ofstream file1; file1.open("namuna.bin", ios::out | ios::app | ios::binary);
Функсия-аъзои open() дар ҳар се класс ofstream, ifstream, fstream мавҷуд аст ва усули кушодани файлҳо аз рӯи хомушӣ (default mode) дар ҳар се синф гуногун аст:
Синф | Усули кушодан аз рӯи хомушӣ |
---|---|
ofstream | ios::out | ios::trunc |
ifstream | ios::in |
fstream | ios::in | ios::out |
Усули кушодан аз рӯи хомушӣ фақат дар ҳолати дар истифодаи функсияи open набудани аргументи дуюм - openmode татбиқ карда мешавад. Агар функсияи open ҳамчун аргументи дуюм ягон қимате дошта бошад, усули кушодан аз рӯи хомӯшӣ инкор карда мешавад, бо он комбинатсия сохта намешавад.
Азбаски якумин амале, ки аз болои объектҳои синфҳои ofstream, ifstream, fstream иҷро карда мешавад ин, одатан, кушодани файл мебошад, ҳар се синф дар сохти худ конструктор доранд, ки дар он функсияи open() истифода мешавад. Ҳамин тариқ, мо метавонем амали кушодани файлро, ки дар боло иҷро шуда буд, ин тавр иҷро кунем:
ofstream file1("namuna.bin", ios::out | ios::app | ios::binary);
Ҳар ду тарзи кушодани файл дурустанд.
Шумо метавонед бо ёрии функсия-аъзо is_open() санҷед, ки файл дуруст кушода шудааст ё не. Дар ҳолати дар ҳақиқат пайваст шудани объект бо файл ин функсия TRUE бозмегардонад, дар ҳолати баръакс FALSE бозмегардонад.
Пӯшидани файл. Баъди он ки кор бо файл ба охир расид, онро пӯшидан зарур аст, то ки он боз дастрас гардад. Барои пӯшидани файл функсия-аъзо close() истифода бурда мешавад. Ин функсия буферро тоза мекунад ва алоқаи байни объект ва файлро канда мекунад. Сохтори он содда аст:
void close();
Яъне дар намунаи болои барои пӯшидани файл чунин навиштан зарур аст:
file1.close();
Агар ин функсия истифода шуда бошад, объект file1 барои кушодани дигар файл истифода шуда метавонад. Ва файл namuna.bin аз тарафи просессҳои дигар боз кушода шуда метавонад.
Дар ҳолати кушода натавонистани файл, деструктори синфҳо автоматикӣ функсияи close()-ро ҷеғ мезананд.
Кор бо файл ҳамчун манбаи матн. Синфҳои ofstream, ifstream, fstream дар асоси синфҳои ostream, istream, iostream сохта шудаанд. Яъне объектҳои синфи fstream метавонанд объектҳои синфҳои модариашро истифода баранд. Умуман, дар вақти кор бо файлҳои матни мо ҳамон аъзоҳои ин синфҳоро, ки ҳангоми кор бо консол (клавиатура - cin ва экрани дисплей - cout) ба мо зарур буданд боз истифода мебарем. Ба монанди мисоли поёнӣ, ки дар он оператори замима << истифода шудааст.
Мисоли сабт ба файли матни:
//namuna28.cpp
using namespace std;
#include <fstream>
int main() {
ofstream file1("namuna.txt");
if(file1.is_open()) {
file1<<"In satri yakum."<<endl;
file1<<"In satri duyum."<<endl;
}
file1.close();
return 0;
}
Баъди иҷрои ин барнома дар каталоги ҷорӣ файли матнии namuna.txt пайдо мешавад, ки онро ёфта бо ягон таҳриргари матнӣ тамошо кунед. Ва ё аз барномаи зерин истифода кунед:
//namuna29.cpp
using namespace std;
#include <fstream>
#include <iostream>
int main() {
char buffer[256];
ifstream file2("namuna.txt");
if(!file2.is_open()) {
cout<<"Khatogi bo khushodani file!"<<endl;
return 0;
}
while(!file2.eof()) {
file2.getline(buffer,80);
cout<<buffer<<endl;
}
file2.close();
return 0;
}
Ҳангоми кушодани файл namuna.txt ягон душворӣ ба амал ояд, дар экран маълумот дар бораи хатогӣ пайдо мешавад ва барнома кори худро қатъ мекунад. Барнома пайдарпай сатрҳоро аз файли матни хонда, онҳоро ба экран чоп мекунад. Функсияи eof() дар ҳолати ба охири файл расидан TRUE бозмегардонад.
Функсияҳои санҷишӣ. Функсияи bad() бозмегардонад TRUE ҳангоми рух додани хатогӣ дар вақти хондан ё сабт кардан. Масалан, ҳангоми кӯшиши сабт ба файле, ки барои сабт кушода нашудааст ё диске, ки ба он шумо сабт карданиед дигар ҷои холӣ надорад.
Функсияи fail() дар ҳамаи ҳолатҳое, ки функсияи bad() TRUE бозмегардонад ва илова бар ин дар ҳолати рух додани хатогиҳои шакли (format error) низ TRUE бозмегардонад. Масалан, ҳангоми кӯшиши хондани адади бутун ягон рамз хонда шудааст.
Функсияи eof() дар ҳолати ба охири файл расидан TRUE бозмегардонад.
Функсияи good() дар ҳамаи ҳолатҳое, ки функсияҳои болои TRUE бозмегардонанд, FALSE бозмегардонад.
Функсияи clear() барои тоза кардани натиҷаҳои санҷиш истифода мешавад.
Як мисоли дигар:
#include <stdio.h>
#include <time.h>
#include <fstream>
#include <iostream>
using namespace std;
int DiscountPercent(double order) {
int percent;
if(order<500)
percent = 0;
else if(order < 1000)
percent = 2;
else if(order < 1500)
percent = 4;
else
percent = 5;
return percent;
}
void DiscountLog(double order, int percent, double discount, double total) {
ofstream f1;
f1.open("E:\\discount.log", ios::app);
char buff[20];
time_t now = time(NULL);
if(f1.is_open()) {
strftime(buff, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));
f1<<buff<<endl;
f1<<"Order: "<<order<<endl;
f1<<"Discount Percent: "<<percent<<endl;
f1<<"Discount Amount: "<<discount<<endl;
f1<<"Total: "<<total<<endl;
f1<<"-------------"<<endl;
}
else {
cout<<"Can't open file"<<endl;
return;
}
f1.close();
}
int main() {
double order; //order's amount
double discount;
double total;
int percent;
char c;
do {
cout<<"Enter Order Amount, please: ";
cin>>order;
percent = DiscountPercent(order);
discount = order/100*percent;
total = order - discount;
cout<<"Order: "<<order<<endl;
cout<<"Discount Percent: "<<percent<<endl;
cout<<"Discount Amount: "<<discount<<endl;
cout<<"Total: "<<total<<endl;
DiscountLog(order, percent, discount, total);
cout<<"Continue?(y - yes, n - no) ";
cin>>c;
} while(c=='y' || c=='Y');
system("pause");
return 0;
}
САВОЛҲО БАРОИ МУСТАҲКАМКУНӢ
1. Дар С++ кор бо файл чӣ хел иҷро карда мешавад?
2. Кадом реҷаҳои кушодани файл мавҷуданд?
3. Барои пӯшидани файл кадом функсия кор фармуда мешавад?
4. Мақсад аз истифодаи функсияҳои санҷишӣ дар чист?