Программалау оқулық Алматы, 012 Қазақстан Республикасы Білім жəне ғылым министрлігінің «Оқулық»



Pdf көрінісі
бет268/465
Дата09.01.2023
өлшемі3,66 Mb.
#60709
түріПрограмма
1   ...   264   265   266   267   268   269   270   271   ...   465
Байланысты:
аибм сплюс

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
құрамында сипатталған, ортақ 
буферді қолдануды қамтамасыз ететін 
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); 


Достарыңызбен бөлісу:
1   ...   264   265   266   267   268   269   270   271   ...   465




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет