Дохилкуни аз файл ва хоричкуни ба файл
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() барои тоза кардани натичахои санчиш истифода мешавад.
САВОЛХО БАРОИ МУСТАХКАМКУНИ
1. Дар С++ кор бо файл чи хел ичро карда мешавад?
2. Кадом речахои кушодани файл мавчуданд?
3. Барои пушидани файл кадом кадом функсия кор фармуда мешавад?
4. Максад аз истифодаи функсияхои санчиши дар чист?


