296
char *str[ ] = {"This is the fi rst line.",
"This is the second line.",
"This is the third line."};
for (int i = 0; i<3; ++i){
out.write(str[i], strlen(str[i]));
out.put('\n');
}
out.close();
// Файлдан оқу
ifstream in("test", ios::in|ios::nocreate);
if(!in){
cout << "Cannot open fi le 'test' for reading"
<< endl;
return 1;
}
char
check_str[3][60];
for (i = 0; i<3; ++i){
in.get(check_str[i], 60);
in.get();}
// Тексеру үшін шығару
for (i = 0; i<3; ++i)
cout << check_str[i] << endl;
in.close();
return
0;
}
Мысалдағы
get(check_str[i],60)
функциясы орындалғаннан кейін
тіркестерді ажыратушы символ
'
\n'
кіріс ағымында қалады, сондықтан бір
символды өткізіп жіберу үшін
get()
əдісін шақыру қажет. Баламалы тəсіл
ретінде
get
функциясының орнына кіріс
ағымынан шектеуіш-символды
шығарып алатын
getline
функциясын қолдануға болады.
4-
мысал.
peek()
жəне
putback()
функциялары əрбір нақты уақыт
мезетінде енгізілетін ақпараттың типі белгісіз болған кезде басқаруды
жеңілдетуге мүмкіндік береді. Келесі программа осыны көрсетеді. Онда файл-
дан (файлдық ағымдар келесі бөлімде қарастырылады) тіркестер немесе бүтін
сандар оқылады. Тіркестер мен бүтін сандар кез келген ретпен орналасуы
мүмкін.
#include
#include
#include
int main(){
char ch;
// файлды дайындау
ofstream
out("test");
297
if(!out)
{
cout << "Cannot open fi le 'test' for writing"
<< endl;
return 1;
}
char str[80], *p;
out << 123 << "this is a test" << 23;
out << "Hello there!" << 99 << "bye" << endl;
out.close();
// файлды оқу
ifstream in("test", ios::in|ios::nocreate);
if(!in){
cout << "Cannot open fi le 'test' for reading"
<< endl;
return 1;
}
do{
p = str;
ch = in.peek(); // келесі символдың типін анықтау
if(isdigit(ch)){
// бүтін санды оқу:
while(isdigit(*p = in.get())) p++;
in.putback(*p);
// символды ағымға қайтару
*p = '\0';
// тіркесті нөлмен аяқтаймыз
cout << "Number: " << atoi(str);
}
else if(isalpha(ch)){ // тіркесті оқу
while(isalpha(*p = in.get())) p++;
in.putback(*p); // символды ағымға қайтар
у
*p = '\0'; // тіркесті нөлмен аяқтаймыз
cout << "String: " << str;
}
else in.get(); // өткізіп жіберу
cout << endl;
}
while(!in.eof());
in.close();
return 0;
}
Программа жұмысының нəтижесі:
Number: 123
String: this
String: is
298
String: a
String: test
Number: 23
String: Hello
String: there
Number: 99
String: bye
Ағымдар арқылы программаны қолданушылармен сұхбат ұйымдастыру
кезінде буферлеу əрекетін ескеру қажет. Мысалы, енгізу əрекетін
орындауға
ұсыныс шығару кезінде оның кіріс ағымынан мəліметтердің оқылуынан бұрын
пайда болатындығына кепілдік бере алмаймыз, өйткені ұсыныс тек шығару
буфері толған жағдайда ғана экранда пайда болады:
cout << "х енгізіңіз";
cin >> х;
Бұл мəселені шешу үшін
basic_ios
құрамында
tie()
функциясы
анықталған, ол
сin.tie(&cout)
түріндегі шақыру арқылы
istream
жəне
ostream
ағымдарын өзара байланыстырады. Осыдан кейін енгізу ағымынан
жаңа символ алу қажет болған сайын шығару жолы тазартылады (яғни
cout.fl ush()
функциясы орындалады).
Бір программада ағымдармен қатар С кітапханасының
немесе
файлдарында сипатталған функцияларын қолдану қажет етілмейді.
Егер бұл белгілі бір себептермен қажет болып жатса,
онда ағымдармен бірінші
операцияны орындағанға дейін
ios_base
құрамында сипатталған, ортақ
буферді қолдануды қамтамасыз ететін
sync_with_stdio()
функциясын
шақыру қажет.
sync_with_stdio(false)
функциясын шақыру буферлерді
ажыратады (бұл жұмыс өнімділігінің артуына алып келуі мүмкін).
Ағымдар қателіктері
ios
базалық класында ағымның қалып-күйін биттер жиыны түрінде
көрсететін
state
өрісі анықталған:
enum io_state{
goodbit = 0x00, // Қателер жоқ
eofbit = 0x01, // Файл соңына жетті
failbit = 0x02, // Форматтау немесе түрлендіру
// қателігі
badbit = 0x04, // Күрделі қате, ол туындағаннан
// кейін ағымды қолдану мүмкін болмайды
hardfail = 0x08 // Жабдықтардың қателігі
};
299
Ағым қалып-күйін басқару үшін төменде көрсетілген əдістер мен операция-
лар қолданылады:
int rdstate()
— ағымның сол сəттегі қалып-күйін қайтарады;
int eof()
— егер
eofbit
жалаушасы орнатылған болса,
нөлге
тең емес мəнді қайтарады;
int fail()
— егер
failbit
,
badbit
немесе
hardfail
жалаушаларының бірі орнатылған болса, нөлге тең
емес мəнді қайтарады;
int bad()
— егер
badbit
немесе
hardfail
мəндерінің бірі
орнатылған болса, нөлге тең емес мəнді қайтарады;
int good()
— барлық қателік жалаушалары алып тасталған бол-
са, нөлге тең емес мəнді қайтарады;
void clear
(int = 0)
— параметр қателік күйі
ретінде қабылданады, пара-
метр жоқ болған жағдайда қателік күйі ретінде 0 ор-
натылады;
operator void*()
— кем дегенде бір қателік биті орнатылған болса,
нөлдік нұсқауышты қайтарады;
operator !()
— кем дегенде бір қателік биті орнатылған болса,
нөлдік емес нұсқауышты қайтарады.
Төменде ағым қалып-күйінің жалаушалары арқылы жиі пайдаланылатын
операциялар келтірілген.
// fl ag жалаушасының орнатылуын тексеру:
if(stream_obj.rdstate() & ios::fl ag)
// fl ag жалаушасын алып тастау:
stream_obj.clear(rdstate() & ~ios::fl ag)
// fl ag жалаушасын орнату:
stream_obj.clear(rdstate() | ios::fl ag)
// fl ag жалаушасын орнату жəне барлық қалған
// жалаушаларлы алып тастау:
stream_obj.clear( ios::fl ag)
// Барлық жалаушаларды алып тастау:
stream_obj.clear()
Ағым 0 мəнімен салыстырылған сайын
void*()
операциясы жанамалы
(тікелей емес) түрде шақырылады. Бұл келесідей циклдерді жазуға мүмкіндік
береді:
while (stream_obj){
// бəрі дұрыс, енгізу/шығаруды орындауға болады
}
Төменде келтірілген мысалда
rdstate()
функциясының жұмысы
көрсетілген. Бұл программа команда жолында аты көрсетілетін мəтіндік
300
файлдың ішкі мазмұнын экранға шығарады. Қате табылған жағдайда функция
ол туралы
CheckStatus()
арқылы хабарлайды.
#include
#include
void CheckStatus(ifstream &in);
Достарыңызбен бөлісу: