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


EOF  мəнін қайтарады; putback(c)



Pdf көрінісі
бет398/642
Дата30.03.2022
өлшемі3,66 Mb.
#29231
түріПрограмма
1   ...   394   395   396   397   398   399   400   401   ...   642
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

 құрамында сипатталған, ортақ 

буферді қолдануды қамтамасыз ететін 



Достарыңызбен бөлісу:
1   ...   394   395   396   397   398   399   400   401   ...   642




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

    Басты бет