Ââîä/âûâîä â C++ ðåaëèçóåòñя ëèáî ñ ïîìîùüþ ôóíêöèé, óíañëåäîâaííûõ îò áèá- ëèîòåêè C, ëèáî ñ ïîìîùüþ ïîòîêîâ C++. Cìåøèâaòü ýòè äâa ñïîñîáa â îäíîé ïðî- ãðaììå ìîæíî òîëüêî ñèíõðîíèçèðîâaâ ââîä ñ ïîìîùüþ ôóíêöèè synC_with_stdiO(). Êaæäûé ñïîñîá èìååò ñâîè ïðåèìóùåñòâa. Ïðåèìóùåñòâî èñïîëüçîâaíèя ïîòî- êîâ â òîì, ÷òî îíè ëåã÷å â èñïîëüçîâaíèè â ïðîñòûõ ñëó÷aяõ ââîäa/âûâîäa, íå òðåáóþùèõ ôîðìaòèðîâaíèя, a, ãëaâíîå, ïîòîêîâûå îïåðaöèè ìîæíî ïåðåîïðåäå- ëèòü äëя ñîáñòâåííûõ êëaññîâ. Ââîä/âûâîä â ñòèëå C óäîáíåå èñïîëüçîâaòü ïðè ôîðìaòèðîâaííîì âûâîäå â ïðîãðaììaõ, íå èñïîëüçóþùèõ îáúåêòíî-îðèåíòèðî- âaííóþ òåõíèêó. Êðîìå òîãî, ñóùåñòâóþò ìèëëèîíû ñòðîê, íaïèñaííûõ ía C è ïåðåíåñåííûõ ía C++, ñ êîòîðûìè ïðîãðaììèñòó ïðèõîäèòñя ñòaëêèâaòüñя. Ïî- òîêè C++ ðaññìaòðèâaþòñя â ðaçäåëå «Ïîòîêîâûå êëaññû», ñ. 265.
Äëя èñïîëüçîâaíèя ôóíêöèé ââîäa/âûâîäa â ñòèëå C íåîáõîäèìî ïîäêëþ÷èòü ê ïðîãðaììå çaãîëîâî÷íûé ôaéë èëè . Ïðè ââîäå/âûâîäå äaííûå ðaññìaòðèâaþòñя êaê ïîòîê áaéòîâ. Ôèçè÷åñêè ïîòîê ïðåäñòaâëяåò ñîáîé ôaéë èëè óñòðîéñòâî, íaïðèìåð, êëaâèaòóðó èëè äèñïëåé, ðaññìaòðèâaþùèåñя êaê ÷a- ñòíûé ñëó÷aé ôaéëa.
Открытие потока
Ðaáîòa ñ ïîòîêîì ía÷èíaåòñя ñ åãî îònðûòèя. Ïîòîê ìîæíî îòêðûòü äëя ÷òåíèя è/èëè çaïèñè â äâîè÷íîì èëè òåêñòîâîì ðåæèìå. Ôóíêöèя îòêðûòèя ïîòîêa èìååò ôîðìaò:
FILE* fOpen(COnst Char* filename, COnst Char* mOde);
Ïðè óñïåøíîì îòêðûòèè ïîòîêa ôóíêöèя âîçâðaùaåò óêaçaòåëü ía ïðåäîïðåäå- ëåííóþ ñòðóêòóðó òèïa FILE, ñîäåðæaùóþ âñþ íåîáõîäèìóþ äëя ðaáîòû ñ ïîòî- êîì èíôîðìaöèþ, èëè NULL â ïðîòèâíîì ñëó÷aå. Ïåðâûé ïaðaìåòð — èìя îòêðû- âaåìîãî ôaéëa â âèäå C-ñòðîêè, âòîðîé — ðåæèì îòêðûòèя ôaéëa:
"r" — ôaéë îòêðûâaåòñя äëя ÷òåíèя;
"w" — îòêðûâaåòñя ïóñòîé ôaéë äëя çaïèñè (åñëè ôaéë ñóùåñòâóåò, îí ñòèðaåòñя);
"a" — ôaéë îòêðûâaåòñя äëя äîáaâëåíèя èíôîðìaöèè â åãî êîíåö;
"r+" — ôaéë îòêðûâaåòñя äëя ÷òåíèя è çaïèñè (ôaéë äîëæåí ñóùåñòâîâaòü);
"w+" — îòêðûâaåòñя ïóñòîé ôaéë äëя ÷òåíèя è çaïèñè (åñëè ôaéë ñóùåñòâóåò, îí ñòèðaåòñя);
"a+" — ôaéë îòêðûâaåòñя äëя ÷òåíèя è äîáaâëåíèя èíôîðìaöèè â åãî êîíåö. Ðåæèì îòêðûòèя ìîæåò òaêæå ñîäåðæaòü ñèìâîëû t (òåêñòîâûé ðåæèì) èëè b
(äâîè÷íûé ðåæèì), îòëè÷aþùèåñя îáðaáîòêîé ñèìâîëîâ ïåðåõîäa ía íîâóþ ñòðîêó. Ïî óìîë÷aíèþ ôaéë îòêðûâaåòñя â òåêñòîâîì ðåæèìå, ïðè êîòîðîì êîì- áèíaöèя ñèìâîëîâ «âîçâðaò êaðåòêè» è «ïåðåâîä ñòðîêè» (0x13 0x10) ïðè ââîäå ïðåîáðaçóþòñя â îäèíî÷íûé ñèìâîë ïåðåâîäa ñòðîêè (ïðè âûâîäå âûïîëíяåòñя îáðaòíîå ïðåîáðaçîâaíèå).  äâîè÷íîì ðåæèìå ýòè ïðåîáðaçîâaíèя íå âûïîëíя- þòñя.
Ïðèìåð:
FILE *f = fOpen("d:\\Cpp\\data", "rb+");
Óêaçaòåëü f èñïîëüçóåòñя â äaëüíåéøèõ îïåðaöèяõ ñ ïîòîêîì. Åãî ïåðåäaþò ôóíêöèяì ââîäa/âûâîäa â êa÷åñòâå ïaðaìåòða.
Ïðè îòêðûòèè ïîòîêa ñ íèì ñâяçûâaåòñя îáëañòü ïaìяòè, íaçûâaåìaя áóôåðîì. Ïðè âûâîäå âñя èíôîðìaöèя íaïðaâëяåòñя â áóôåð è íaêaïëèâaåòñя òaì äî ça- ïîëíåíèя áóôåða èëè äî çaêðûòèя ïîòîêa. ×òåíèå îñóùåñòâëяåòñя áëîêaìè, ðaâ- íûìè ðaçìåðó áóôåða, è äaííûå ÷èòaþòñя èç áóôåða. Áóôåðèçaöèя ïîçâîëяåò áîëåå áûñòðî è ýôôåêòèâíî îáìåíèâaòüñя èíôîðìaöèåé ñ âíåøíèìè óñòðîéñòâa- ìè. Cëåäóåò èìåòü â âèäó, ÷òî ïðè aâaðèéíîì çaâåðøåíèè ïðîãðaììû âûõîäíîé áóôåð ìîæåò áûòü íå âûãðóæåí, è âîçìîæía ïîòåðя äaííûõ. C ïîìîùüþ ôóíê- öèé setbuf è setvbuf ìîæíî óïðaâëяòü ðaçìåðaìè è íaëè÷èåì áóôåðîâ.
Cóùåñòâóåò ïяòü ïðåäîïðåäåëåííûõ ïîòîêîâ, êîòîðûå îòêðûâaþòñя â ía÷aëå ða- áîòû ïðîãðaììû: ñòaíäaðòíûé ââîä stdin, ñòaíäaðòíûé âûâîä stdOut, ñòaíäaðò- íûé âûâîä ñîîáùåíèé îá îøèáêaõ stderr, ñòaíäaðòíûé äîïîëíèòåëüíûé ïîòîê stdaux è ñòaíäaðòíaя ïå÷aòü stdprn. Ïåðâûå òðè ïîòîêa ïî óìîë÷aíèþ îòíîñяòñя ê êîíñîëè. Ýòè óêaçaòåëè ìîæíî èñïîëüçîâaòü â ëþáîé ôóíêöèè ââîäa/âûâîäa òaì, ãäå òðåáóåòñя óêaçaòåëü ïîòîêa.
Ввод/вывод в поток
Ââîä/âûâîä â ïîòîê ìîæíî îñóùåñòâëяòü ðaçëè÷íûìè ñïîñîáaìè: â âèäå ïîñëå- äîâaòåëüíîñòè áaéòîâ, â âèäå ñèìâîëîâ è ñòðîê èëè ñ èñïîëüçîâaíèåì ôîðìaò- íûõ ïðåîáðaçîâaíèé. Äëя êaæäîãî âèäa îïåðaöèé îïðåäåëåí ñâîé íaáîð ôóíê- öèé.
Îïåðaöèè ââîäa/âûâîäa âûïîëíяþòñя ía÷èíaя ñ òåêóùåé ïîçèöèè ïîòîêa, îïðå- äåëяåìîé ïîëîæåíèåì ónaçaòåëя ïîòîna. Óêaçaòåëü óñòaíaâëèâaåòñя ïðè îòêðû- òèè ía ía÷aëî èëè êîíåö ôaéëa (â ñîîòâåòñòâèè ñ ðåæèìîì îòêðûòèя) è èçìåíя- åòñя aâòîìaòè÷åñêè ïîñëå êaæäîé îïåðaöèè ââîäa/âûâîäa. Òåêóùåå ïîëîæåíèå óêaçaòåëя ìîæíî ïîëó÷èòü ñ ïîìîùüþ ôóíêöèé ftell è fgetpOs è çaäaòü яâíûì îáðaçîì ñ ïîìîùüþ ôóíêöèé fseek è fsetpOs. Ýòè ôóíêöèè íåëüçя èñïîëüçîâaòü äëя ñòaíäaðòíûõ ïîòîêîâ. Íèæå ïåðå÷èñëåíû îñíîâíûå ôóíêöèè ââîäa/âûâîäa ïîòîêa.
×òåíèå è çaïèñü ïîòîêa áaéòîâ âûïîëíяþò ôóíêöèè fread è fwrite.
×òåíèå ñèìâîëa èç ïîòîêa — getC, fgetC, èç ñòaíäaðòíîãî ïîòîêa stdin —
getChar.
Çaïèñü ñèìâîëa â ïîòîê — putC, fputC, â ñòaíäaðòíûé ïîòîê stdOut — putChar.
×òåíèå ñòðîêè èç ïîòîêa — fgets, èç ñòaíäaðòíîãî ïîòîêa stdin — gets.
Çaïèñü ñòðîêè â ïîòîê — fputs, â ñòaíäaðòíûé ïîòîê stdOut — puts.
Ôîðìaòèðîâaííûé ââîä èç ïîòîêa — fsCanf, èç ñòaíäaðòíîãî ïîòîêa stdin —
sCanf, èç ñòðîêè — ssCanf.
Ôîðìaòèðîâaííûé âûâîä â ïîòîê — fprintf, â ñòaíäaðòíûé ïîòîê stdOut —
printf, â ñòðîêó — sprintf.
Закрытие потока
Ïîòîê çaêðûâaåòñя ëèáî ïðè çaâåðøåíèè ïðîãðaììû, ëèáî яâíûì îáðaçîì ñ ïî- ìîùüþ ôóíêöèè fClOse:
int fClOse(FILE*);
Ïåðåä çaêðûòèåì ïîòîêa èíôîðìaöèя èç ñâяçaííûõ ñ íèì áóôåðîâ âûãðóæaåòñя ía äèñê. Ðåêîìåíäóåòñя âñåãäa яâíûì îáðaçîì çaêðûâaòü ïîòîêè, îòêðûòûå äëя çaïèñè, ÷òîáû èçáåæaòü ïîòåðè äaííûõ.
Обработка ошибок
Ôóíêöèè ðaáîòû ñ ïîòîêîì âîçâðaùaþò çía÷åíèя, êîòîðûå ðåêîìåíäóåòñя aía- ëèçèðîâaòü â ïðîãðaììå è îáðaáaòûâaòü îøèáî÷íûå ñèòóaöèè, âîçíèêaþùèå, ía- ïðèìåð, ïðè îòêðûòèè ñóùåñòâóþùèõ ôaéëîâ èëè ÷òåíèè èç ïîòîêa. Ïðè ðaáîòå ñ ôaéëaìè ÷añòî èñïîëüçóþòñя ôóíêöèè feOf è ferrOr:
int feOf(FILE*) âîçâðaùaåò íå ðaâíîå íóëþ çía÷åíèå, åñëè äîñòèãíóò êîíåö ôaéëa, â ïðîòèâíîì ñëó÷aå 0;
int ferrOr(FILE*) âîçâðaùaåò íå ðaâíîå íóëþ çía÷åíèå, åñëè îáíaðóæåía îøèáêa ââîäa/âûâîäa, â ïðîòèâíîì ñëó÷aå 0.
Пример работы с потоками
Äîïóñòèì, ÷òî â ôaéëå õðaíяòñя ñâåäåíèя î ìîíèòîðaõ.  êaæäîé ñòðîêå óêaçaí òèï, îïòîâaя è ðîçíè÷íaя öåíû è ïðèìå÷aíèå. Äëя ïðîñòîòû äaííûå â êaæäîé ñòðîêå çaïèñaíû åäèíîîáðaçíî: ïåðâûå 20 ñèìâîëîâ çaíèìaåò òèï ìîíèòîða, äa- ëåå ïî 5 ñèìâîëîâ öåëûå ÷èñëa, ïðåäñòaâëяþùèå îïòîâóþ è ðîçíè÷íóþ öåíû, ça- òåì ïðèìå÷aíèå äëèíîé íå áîëåå 40 ñèìâîëîâ.
Ïðèâåäåííaя íèæå ïðîãðaììa ïîñòðî÷íî ñ÷èòûâaåò äaííûå èç òåêñòîâîãî ôaéëa â áóôåðíóþ ïåðåìåííóþ s, çaòåì ôîðìèðóåò èç íèõ ñòðóêòóðó mOn è çaïèñûâaåò åå â äâîè÷íîì ðåæèìå â âûõîäíîé ôaéë. Äaëåå èëëþñòðèðóåòñя ñ÷èòûâaíèå èç ýòîãî ôaéëa ïðîèçâîëüíîé çaïèñè.
inClude inClude inClude inClude int main(){
FILE *fi, *fO;
if((fi = fOpen("d:\\C\\file.txt", "r")) == 0){
COut << "Îøèáêa îòêðûòèя âõîäíîãî ôaéëa"; return 1;} if((fO = fOpen("d:\\C\\binfile.Out", "w+b")) == 0){
COut << "Îøèáêa îòêðûòèя âûõîäíîãî ôaéëa"; return 1;} COnst int dl = 80;
Char s[dl]; struCt{
Char type[20]; int Opt, rOzn; Char COmm[40];
}mOn;
int kOl = 0; // Êîëè÷åñòâî çaïèñåé â ôaéëå while (fgets(s, dl, fi)){
// Ïðåîáðaçîâaíèå ñòðîêè â ñòðóêòóðó:
strnCpy(mOn.type, s, 19); // Îïèñaíèå strnCpy ñì. â ïðèëîzåíèè 6 mOn.type[19]='\0';
mOn.Opt = atOi(&s[20]); // Îïèñaíèå atOi ñì. â ñëåä. ðaçäåëå mOn.rOzn = atOi(&s[25]);
strnCpy(mOn.COmm, &s[30], 40); fwrite(&mOn, sizeOf mOn, 1, fO); kOl++;
}
fClOse(fi);
int i; Cin >> i; // Íîìåð çaïèñè
if (i >= kOl){COut << "Çaïèñü íå ñóùåñòâóåò"; return 1;}
// Óñòaíîâêa óêaçaòåëя òåêóùåé ïîçèöèè ôaéëa ía çaïèñü i: fseek(fO, (sizeOf mOn)*i, SEEK_SET);
fread(&mOn, sizeOf mOn, 1, fO);
COut << "mOn.type " << mOn.type << " Opt " << mOn.Opt
<< " rOzn " << mOn.rOzn << endl; fClOse(fO);
return 0;
}
Do'stlaringiz bilan baham: |