EOF
мəнін қайтарады;
putback(c)
— ағымға
с
символын орналастыра-
ды, ол ағымнан мəлімет шығарып алу
кезінде үстіміздегі символға айналады;
read(buf,num)
— num
символды (немесе символдар
саны
num
шамасынан аз болса, барлық
символдарды)
buf
символдық жиымына
оқиды да, сілтемені жұмыс істеп тұрған
ағымға қайтарады;
readsome(buf,num)
— num
символды (немесе символдар
саны
num
шамасынан аз болса, барлық
символдарды)
buf
символдық жиымы-
на оқиды да, оқылған символдар санын
қайтарады;
seekg(pos)
— ағымдағы оқу позициясын
pos
мəніне орнатады;
seekg(offs, org)
— org
параметрімен анықталатын
позициялардың бірінен –
ios::beg
(файл басынан),
ios::cur
(ағымдағы
пози циядан) немесе
ios::end
(файл
соңы нан) бастап санай отырып, ағым-
дағы оқу позициясын
offs
байтқа
жылжытады;
tellg()
— ағымды оқу кезінде үстіміздегі пози-
цияны қайтарады;
unget()
— соңғы оқылған символды ағымға ор-
наластырады да, сілтемені жұмыс істеп
тұрған ағымға қайтарады.
294
ostream
класында мəліметтерді форматталмаған түрде шығаруға
арналған, жоғарыда көрсетілгендерге ұқсас функциялар анықталған:
fl ush()
— шығару ағымының құрамын физикалық құрылғыға
жазады;
put(с)
— ағымға с символын шығарады да, сілтемені ағымға
қайтарады;
seekp(pos)
— ағымдағы жазу позициясын
pos
мəніне орнатады;
seekp(offs
,
org)
— org
параметрімен анықталатын позициялар-
дың бірінен –
ios::beg
(файл басынан),
ios::cur
(ағымдағы позициядан) немесе
ios::end
(файл
соңынан) бастап санай отырып, ағымдағы жазу пози-
циясын
offs
байтқа жылжытып ығыстырады;
tellp()
— ағымның сол сəттегі жазу позициясын қайтарады;
write(buf, num)
— buf
жиымынан
num
символды ағымға жазады
жəне сілтемені ағымға қайтарады.
1-мысал. Программа сөз тіркестерін кіріс ағымынан символдық жиымға
оқиды.
#include "iostream.h"
int main(){
const int N = 20, Len = 100;
char str[N][Len];
int i = 0;
while (cin.getline(str[i], Len, '\n') && i
// ...
i++;
}
return
0;
}
2-мысал. Программа файлға (файлдық ағымдар келесі бөлімде
қарастырылады) жылжымалы нүктелі санды жəне символдар тіркесін жазады,
содан кейін оларды файлдан оқып, экранға шығарады:
#include
#include
#include
int main(){
// Файлға жазу
ofstream
out("test");
if(!out){
cout << "Cannot open fi le 'test' for writing" << endl;
295
return 1;
}
double num = 100.45;
char str[ ] = "This is a test.";
out.write(reinterpret_cast(&num),
sizeof(double));
out.write(str, strlen(str));
out.close();
// Файлдан оқу
ifstream in("test", ios::in|ios::nocreate);
if(!in){
cout << "Cannot open fi le 'test' for reading"
<< endl;
return 1;
}
double
check_num;
char
check_str[60];
in.read(reinterpret_cast
*>(&check_num),
sizeof(double));
in.read(check_str,
60);
int lstr = in.gcount(); // оқылған символдар саны
check_str[lstr] = 0; // нөл-символды тіркес
// соңына енгізу
cout << check_num << ' ' << check_str << endl;
in.close();
return
0;
}
Бұл мысалдағы
write()
жəне
read()
функцияларының шақырылуын-
дағы
reinterpret_cast
типін келтіру параметр символдық жиым
болмайтын жағдайларда қажет болып табылады.
3-мысал. Төменде көрсетілген программада
test
файлы құрылады да,
оған үш тіркес шығарылады.
#include
#include
#include
int main(){
// Файлға жазу
ofstream
out("test");
if(!out)
{
cout << "Cannot open fi le 'test' for writing"
<< endl;
return 1; }
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
құрамында сипатталған, ортақ
буферді қолдануды қамтамасыз ететін
Достарыңызбен бөлісу: |