Енгізу – шығару ағын байланысы
Программалау тілдері үшін енгізу - шығару стандартты құрылғыларын проекциялау және реализациялау мақсатындағы кең таралған қиындық. Дәстүрлі енгізуді - шығару құрылғылары тек аз ғана қоса салынған типтердің саны. Бірақ, қарапайым емес С++ бағдарламаларда көптеген пайдаланушылық мәліметтер типтері бар. Сондықтан,осындай мағыналы типті енгізу - шығару мүмкіндіктерін пайдалануға мүмкіндік беру қажет. Енгізу - шығару құрылғылары жай ғана қарапайым, ыңғайлы, қолданыста сенімді және де ең қажеттісі бірдей болу керек екені айқын. Әзірге бәрінің көңілінен шығатын нәтижені ешкім таба қойған жоқ, сол себепті қолданушыға басқа енгізу - шығару құрылғыларын құруға мүмкіндік беру керек, және де қолданысына қарай стандартты енгізу - шығару құрылғыларын кеңейту.
С++-ті жасау мақсаты: қолданушы мәліметтердің жаңа типтерін сипаттай алуы, ыңғайлы және нәтижелі жұмыс істей алуы қоса салынған типтері секілді. Сөйтіп, С++ программалау және қолдану үшін енгізу - шығару құрылғылары бәріне ортақ болғанын талап еткен дұрыс сияқты. Осы талаптарды қанағаттандыру нәтижесінде енгізу - шығару ағындық құрылғылары алынды. Енгізу - шығару ағындық құрылғыларының негізгі мақсаты – бұл белгілі бір типтің объектілерін символдар жүйесіне және керісінше айналдыру процесі. Енгізу - шығарудың басқа схемалары бар, бірақ көрсетілгені негізгі болып табылады, және де символды тек жай ғана биттер жиыны деп санасақ, оның табиғи алфавиттік байланысын ескермей, онда көптеген екілік енгізу - шығару схемасын оған келтіруге болады. Сол себепті бағдарламашылық мән мақсаты анықталған типтің объектісі мен типсіз ( яки маңызды ) жол арасындағы байланысын сипаттау болып табылады.
Жолдық ағындар
Жол ағыны жұмысын istringstream, ostringstream stringstream кластары қамтамасыз етеді, istream, ostream және iostream өндірістік класстар болып табылады. Жол ағымын қолдану үшін бағдарламаға ostream бастапқы файлын қосу қажет.
Жол ағынын қолдану, файл ағынын қолдану аналогты айырмашылығы физикалық мәлімет дискідегі файлда емес, оперативтің есінде сақталады. Одан басқа, жол ағыны класы str ( ) әдісінен құралады, string жол көшірмесін қайтаратын немесе сондай жол ағынының мағынасын иемденетіндер:
string str ( )
void str ( const string & s );
Жол ағынында кейбір C кітапханасында sscanf ( ) және sprintf ( ) аналогты функция болып табылады, сонымен қатар естегі жолдармен жұмыс жасайды, енгізу және шығару консолі сипатталған. Мысалы: sprintf ( ) көмегімен естегі кейбір символдық жолдарды қалыпқа келтіруге болады, сосын ол экранға шығады. Бұл қиындықтарды ostringstream объектісімен оңай шешуге болады.
Мысал ретінде алдық бағдарламаның модифицирленген нұсқасын келтірейін, мәтін файлын экранға шығаратын, мәтіндегі әр жолды тексеретін “Line N: ”, мұндағы N—жол нөмірі:
// MyCopy.ccp файлынан — error ( ) функциясын анықтау
// . . .
int main ( int argc. char* argv [ ] ) {
i f (argc != 2) error ( " Қате аргумент саны. " ) ;
ifstream tfile ( argv [ 1 ] ) ;
if ( ! tfile ) error ( “ Қате енгізу файлы : ” . argv [ 1 ] ) ;
int n = 0
char buf [ 1024 ] ;
while ( ! tfile. eof ( ) ) {
n++;
tfile. getline ( buf. sizeof ( buf ) ) ;
line << “ Line ” << setw ( 3 ) << n << “ : “ << buf << endl ;
}
return 0 ;
}
Келесі мысал файлдың дұрыс ашылғанын тексереді.
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{ ifstream in;
in.open ("test.txt");
if (!in)
cout << "Error: open file ‘test.txt’ failed." << endl;
return 0; }
Файлмен жумыс текстік файл ішіне сөз жазу программасы:
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include "conio.h"
#include "string.h"
using namespace std;
int main()
{char k[100];//текстык файлга жазатын с
char f[]="me.txt\0";//текстык файл
FILE *y;//файлды алу
y=fopen(f,"w");//файлды ашу me.txt мундыгы "w"-бос файлды информация жазу ушын ашу
printf("%s-Failga saktagin kelgen soz jaz:",f);
gets(k);//символ енгызу командасы
fprintf(y,"%s",k);//файлга сактау
fclose(y);//файлды жабу
printf("%s-Failga saktaldi",f);
getch();
}
Көрсетілген бойынша, ағындар файлға байланысты болу мүмкін, негізгі жадта сақталған символдарға емес, диск арқылы. Негізгі жадқа да символдарды қосуға болады. Мысалы: тез баспаға жатпайтын хабарламаны форматтау үшін шығулы жолдық ағындармен қолдануға болады.
char* p = new char[message_size];
ostrstream ost(p,message_size);
do_something(arguments,ost); display(p);
Функция do_something стандарттық шығару операция бойынша ost деген функцияны ағынға жазуға болады, ost функциясын бағынушы функцияларға тапсыруға да болады. Әлде толықтыру бақылауы қажет емес, яғни ost өзінің өлшемін біледі, және толықтырған кезде fail ( ) деген жағдайға ауысады. Содан соң функция display « шын » шығулы ағынға хабарлама жіберу мүмкін. Ондай әдіс көбінесе күрделі құрылғыларға соңғы операцияларды жазғанда үйлеседі, яғни шығулы құрылғылар әдеттегі жол жүйелілікке апарады. Мысалы, ost функциясы экрандағы бекітілген облысқа сәйкес болу мүмкін. Тап солай , istrstream шығулы жолдық ағын болады, ол нөлмен аяқталатын символдардан окылады :
void word_per_line ( char v [ ], int sz )
/*
"v" өлшеммен"sz" бірден жолға жазу
*/
{
istrstream ist ( v, sz );
char b2 [ MAX ];
while ( ist >> b2 ) cout << b2 << " \n ";
}
Аяқтайтын нөл файлдың соңы болып саналады.
Жолды ағындар < strstream.h > файлында көрсетіледі.
Енгізу-шығарудың әрбір операциясы деректер типіне нәзік жолмен орындалады.С++ тілінде байттық енгізу-шығару ағыны шығарылады. Енгізу- шығару механизмі деректердің құрылғыдан оперативті жадқа және сенімді жолмен қорытындыланады. С++ тілі енгізу-шығару үшін «төменгі» және «жоғарғы» деңгейлерге мүмкіндік береді. Төменгі деңгейдегі енгізу-шығару деректердің кейбір байт сандарын құрылғыдан жадқа немесе жадтан құрылғыға қайта жіберу керек екеніне жалпыланады. Енгізу-шығару жоғарғы деңгейі, деректердің байт саны элементтері бойынша біріктіріледі, мысалы бүтін сандар, жылжымалы үтір сандар, символдар, жолдар және қолданушымен анықталған деректер типі. С++ тілі форматталған және форматталған емес енгізу-шығару үшін де мүмкіндік береді. Форматталған емес енгізу-шығару файлдардың жоғары жылдамдықпен қайта берілуінің орындалуына мүмкіндік береді, бірақ ол қолданылуы қиын тек әлі толық емес деретерді қайта өңдейді. Форматталған енгізу-шығару құрылымды деректерді өңдейді, бірақ оларды өңдеуге қосымша уақыт қажет, бұл үлкен көлемді деректерді тасымалдау кезінде кемшілік болуы мүмкін. С++тегі программалардың көбісі тақырыпты файлды қосады, яғни ол енгізу-шығарудың барлық операциялары үшін керекті және негізгі ақпаратты құрйды. тақырыптық файлы ағынның параметрлік монипулятор көмегі кезінде форматталған енгізу-шығаруды өңдеу үшін пайдалы ақпаратты құрайды. тақырыптық файлы файлдармен операция жүргізу үшінқажетті ақпаратты құрайды. тақырыптық файлы форматталған енгізу-шығаруды жадқа енгізу үшін қажетті ақпараттарды құрайды. тақырыптық файлы программалар үшін маңызды мағлұматтар қосады, яғни оларды С және С++ тілдер стилінің бірігуінен енгізу-шығару операцияларын орындау үшін қолданады. Iostream кітапханасы енгізу-шығару операциясының кең спектрін өңдеу үшін көп кластарды құрайды: - istream класы ағындардың енгізу операциясын ұстайды; - ostream класы ағындардың шығару операциясын ұстайды; - iostream класы ағындардың енгізу, әрі шығару операциясын ұстайды; - istream және ostream кластары тікелей мұрагерленген ios базалық класының туынды кластары болып табылады; - iostream класы көп мұрагерленген istream және ostream кластарының туынды класы болып табылады; Солға (<>) жылжыту операциясы енгізуді ағында белгілеу үшін шамадан тыс жүктелген және ол ағыннан алу операциясы деп аталады. Cin енгізуі istream класының стандартты ағынының объектісі енгізудің стандартты құрылғысына байланған, әдетте пернелер тақтасына.Cout шығару ostream класының стандартты ағынының объектісі шығарудың стандартты құрылғысына байлаған, әдетте дисплей экранына. Ostream класының cerr объектісі қателіктер туралы хабарлама шығраудың стандартты құрылғысына байланған. Деректердің шығарылатын ағындары cerr объект3с3 8ш3н буферленген емес болып табылады. Endl ағынының монипуляторы жаңа жолға көшуді шақырады, сонымен қатар шығару буферінің жойылуына әкеп соқтырады. С++ компиляторы енгізу және шығару кезінде автоматты түрде деректердің типін анықтайды. Он алтылық форматта адрес көрсетіледі. Адрес басылымы үшін көрсеткіш типін void типіне әкелуге болады. Put функция-элементі бірлік символ шығарады.put функциясының шақырылуы алқаланған болуы мүмкін. Ағынды енгізу ағыннан » алу операциясымен орындалады. Бұл операция автоматты түрде кіру ағынындағы ажыратқыш символдарды ескермейді.» операциясы false-ні қайтарады, егер ағында файл соңының белгісі кездессе. Ағыннан алу операциясы дұрыс емес типті деректерді енгізген кезде,failbit битті орнатуға операцияның сәтті емес аяқталуы кезінде badbit битін орнықтыруға әкеп соқтырады. Артынан деректерді енгізуге болады, яғни while тақырып циклының шартты операторында ағыннан алу операциясы қолдану арқылы. Ағыннан алу операциясы false- ні қайтарады,егер файл соңының белгісі кездессе. Форматты емес енгізу-шығару read және write функция-элементі көмегімен орындалады. Олардың әрқайсысы кейбір байт сандарын символды массивқа енгізеді немесе одан шығарады. Бұл байттар қандай да бірформаттауға ұшырамайды және жаңа байттар сияқты енгізіледі немесе шығарылады. Gcount функция-элементі соңғы read операциясымен оқылған символдардың саны туралы хабарлайды. Read функция-элементі символды массивқа көрсетілген символдар санын енгізеді. Егер символдардың аз саны оқылса , онда failbit биті орнатылады.
С++ ортасында ағындарды байланыстырып
файлдармен жұмыс жасау.
Әрбір файл немесе файл соңының маркерімен немесе қолданатын жүйедегі деректердің қызметтік құрылымына жазылған байттардың көрсетілген санымен аяқталады. Файл ашылғанда объект құрылады және ағын осы объектпен байланысады.Сонымен қатар автоматты түрде төрт объект құрылады- cin, cout, cerr және clog. Осы объектпен байланысқан ағындар программалар арасында байланыс каналдарын және жеке файлдармен немесе құрылғылармен қамтамасыз етеді. С++ тегі файлдарды өңдеу үшін және тақырыптық файлдары қосылуы керек. файлы istream (файлдарды енгзу үшін), ofstream(файлдарға шығару үшін) және fstream(файлдарды енгізу- шығару үшін) ағындарының кластарының анықтамасын қосады. Файлдар осы ағындар кластардың объекттерін құру жолымен ашылады. Бұо ағындардың кластары сәйкес istream, ostream,iostream кластарынан алынған туынды болып табылады.Енгізу-шығару ағындарына арналған функция-элементтер, операциялар және монипуляторлар, сонымен қатар файлдардың ағындарына қолданылуы мүмкін. Файлдармен жұмыс істеу функциясының сипаттамасы stdio.h кітапханасында орналасқан. MFC кітапханасына файлдармен жұмыс істеуді қамтамасыз ету үшін бірнеше кластар қосылған. Төменде қарастырылатын кластар файлдарменжұмыс істеуді қамтамасыз ету үшін арналған Cfile базалық класынан мұрагерленген. Файлға кіру мүмкіндігін алу үшін, алдымен CFile класының объектісін құру керек. Класс құраушысы осы объектті құрғаннан кейін файлды ашуға рұқсат береді. Бірақ файлды кешіректеу ашуға да болады, яғни Open әдісін қолдану арқылы. Open әдісінің прототипінің келесі түрлері бар: virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError=NULL); Файлмен жұмыс істеуді аяқтағаннан кейін, оны жабу керек. CFile класы ол үшін close арнайы әдісін иеленген. Егер CFile класының объектісі құрылса және файл ашылса, содан кейін объект жойылса, онда онымен байланысты файл автоматты түрде деструктор көмегімен жабылады. Файлдарға кіру үшін CFile класының бірнеше әдістері арналған:CFile: Read, ReadHuge, Write, WriteHuge, Flush. Методы Read және ReadHuge әдістері алдын ала ашылған файлдағы деректерді оқу үшін арналған. 32- разрядтік операциондық жүйелерде екі әдіс те файлдан 65535-тен астам байтты бір уақытта оқи алады. Cfile класының әдісі файлдың жолын орнықтыруға мүмкіндік береді. Бұл әдіс құрмайды, көшірмейді,файлдық атын өзгертпейді, ол тек Cfile класының объектісінде деректердің сәйкес элементін толтырады. CMemFile классы МҒС кітапханасына Cfile базалық класын мұрагерленген CMemFile класы кіреді. CMemFile класы файлды, операти втік жадта орналасқан, CMemFile класының объектілерімен көрсетеді,яғни CFile кластарының объектілерімен сияқты. Айырмашылығыс сонда, CmemFile объектісімен байланысқан файл дискта емес, компьютердің оперативті жадында орналасқан. Осындай файлмен операция жылдам орындалады, қарапайым файлдарға қарағанда. CmemFile класының объектілерімен жұмыс істей келе, жоғарыда көрсетілген CFile класының барлық әдістерін қолдануға болады. Деректерді сондай файлға жазуға немесе оларды санауға болады. Осы әдістерден басқа CMemFile класының құрамына қосымша әдістер қосылған. CMemFile класының объектілерін құру үшін екі әртүрлі құраушы (конструктор) арналған. CMemFile бірінші конструктор тек бір аса қажетті емес nGrowBytes параметрін иеленген: CMemFile(UINT nGrowBytes=1024); Бұл құраушы оперативтік жадта бос файл автоматты түрде ашылады. Осындай файлға жазылу басталып жатқанда, автоматты түрде жадтың блогы белгіленеді. Жад алу үшін CmemFile класының әдістері malloc, realloc және free стандартты функцияларын шақырады.Егер берілген жад блогы жеткілікті емес болса, онда оның өлшемі ұлғаяды.Файлдың жад блогын ұлғайту бөлікпен CMemBytes байт бойынша жүргізіледі. CMemFile класының объектісін жойғаннан кейін қолданылған жад автоматты түрде жүйеге оралады. Cfile базалық класынан мұрагерленген CstdioFile класы буферленген енгізу- шығаруды мәтіндік және екілік режимде қолдануға мүмкіндік береді. CStdioFile класының объектілері үшін CFile класының барлық әдістерін шақыруға болады.Мәтіндік файлға жазу үшін және оқу үшін CStdioFile класыекі жаңа әдісті қосады: ReadString және WroteStreang. Бірінші әдіс файлдан символдар қатарын оқуға мүмкіндік береді, ал екінші әдіс- жазу.
