веденнЯ/виведеннЯ з використаннЯм рґзних класґв

Ћтже, ми визначили, що потоковґ класи - це постачальники ґнструментґв длЯ роботи з файлами. “ потокових класах зберґгаютьсЯ:

- структури, що забезпечують вґдкриттЯ/закриттЯ файлґв;

- функцґ» (методи) вґдкриттЯ/закриттЯ файлґв;

- ґншґ функцґ» ґ данґ, що забезпечують, Як ми побачимо далґ, власне ввґд/вивґд.

Ростґр ґмен

Ѓагато серйозних додаткґв складаютьсЯ з декґлькох програмних файлґв (з вихґдним текстом програм), Якґ створюютьсЯ ґ обслуговуютьсЯ окремими групами програмґстґв. § тґльки пґслЯ цього всґ файли збираютьсЯ в загальний проект. Ђле Як бути з тим фактом, що в таких файлах можуть бути однаково оголошенґ рґзнґ змґннґ? “ ‘++ це незручнґсть дозволЯ№тьсЯ за допомогою так званих просторґв ґмен, що вводЯтьсЯ в кожен текстовий програмний файл проекту за допомогою директиви:

Namespace <ґХмЯ_простору_ґмен (ґдентифґкатор)> {‚ цґ дужки вставлЯ№тьсЯ весь програмний текст}

Љоли йде збґрка загального проекту, то в пґдсумковому текстґ пишуть директиву:

using namespace:: <ґдентифґкатор_простору_имен>;

–е забезпечу№ в пґдсумковому проектґ доступ до змґнних файлу з даними простору ґмен. Џри використаннґ потокових класґв мови ‘++ в основнґй програмґ потрґбно писати директиву:

using namespace::std;

‚ ґншому випадку програма не пройде компґлЯцґю. “ лґстингу 8 наводитьсЯ приклад використаннЯ директив простору ґмен.

Ґстинг 8

#include <vcl.h>

#include <iostream>

#include <conio.h>

namespace F {

float x = 9;

}

namespace G {

using namespace F; /* тут сам простґр G використову№ простґр F, ґ в ньому ж оголошу№тьсЯ ще один простґр: INNER_G */

float y = 2.0;

namespace INNER_G {

float z = 10.01;

}

} // G

int main() {

using namespace G; /* цЯ директива дозволЯ№ користуватисЯ всґм, оголошеним у просторґ G */

using namespace G::INNER_G; /* цЯ директива дозволЯ№ користуватисЯ всґм, оголошеним тґльки в INNER_G */

float x = 19.1; // локальне оголошеннЯ перевизнача№ попередн№

std::cout << "x = " << x << std::endl;

std::cout << "y = " << y << std::endl; // y беретьсЯ ґз простору F

std::cout << "z = " << z << std::endl; /* z беретьсЯ ґз простору INNER_G */

getch();

return 0;

}

‚ результатґ на екранґ зХЯвитьсЯ:

x = 19.1

y = 2

z = 10.01

std::cout С це стандартний вивґд. ‰ого ми розглЯнемо далґ. ’ут показано, що об'№кт cout належить простору ґмен std.

Обота з класом fstream

—лени цього класу дозволЯють вґдкрити файл, записати в нього данґ, перемґстити вказґвник позицґонуваннЯ в файлґ (вказґвник, Який показу№, на Якому мґсцґ у файлґ ми знаходимосЯ) в те чи ґнше мґсце, прочитати данґ.

–ей клас ма№ наступнґ основнґ функцґ» (методи):

- open () - вґдкрива№ файл;

- close () - закрива№ файл;

- is_open () - Якщо файл вґдкритий, то поверта№ true, ґнакше - false;

- rdbuf () - вида№ вказґвник на буфер введеннЯ/виведеннЯ.

”ормат функцґ» open ():

open (char * file_name, open_mode);

де file_name - ґм'Я файлу, open_mode - спосґб вґдкриттЯ файлу.

‘посґб вґдкриттЯ файлу зада№тьсЯ значеннЯм перечислимого змґнно»:

enum open_mode {app, binary, in, out, trunc, ate};

–Я змґнна визначена в базовому класґ ios, тому зверненнЯ до перечислимого значеннЯм в класґ fstream, з примґрником Якого ми працю№мо, повинно йти ґз зазначеннЯм класу-батька: ios :: app, ios :: binary ґ т. д.

ЏризначеннЯ способґв вґдкриттЯ файлу:

- app - вґдкрити файл длЯ дозапису в його кґнець;

- binary - вґдкрити файл у бґнарному виглЯдґ (такґ файли були записанґ по певнґй структурґ даних ґ тому повиннґ читатисЯ по цґй же структурґ);

- in - вґдкрити файл длЯ читаннЯ;

- out - вґдкрити файл длЯ запису в його початок. џкщо файл не ґсну№, вґн буде створений;

- trunc - знищити вмґст файлу, Якщо файл ґсну№ (очистити файл);

- ate - встановити вказґвник позицґонуваннЯ файлу на його кґнець.

Џри завданнґ режимґв вґдкриттЯ файлу можна застосовувати оператор логґчного ЂЃЋ (||), щоб складати необхґдне по№днаннЯ режимґв вґдкриттЯ.

Ќаведемо приклад програми роботи з класом fstream (лґстинг 9).

ЏоЯсненнЯ до програми данґ по тексту. ђезультат роботи показаний на рис. 2.

Ґстинг 9

#include <vcl.h>

#include<fstream>

#include<iostream>

#include <conio.h>

#include <stdio.h>

void main() {

using namespace std; /* ‚икористову№тьсЯ стандартне простґр ґмен. ‘твореннЯ двонаправленого (читаннЯ-запис в одному ґ тому ж файлґ) об'№кта (екземплЯра) */

fstream inout;

inout.open ("fstream.out", ios_base :: in | ios_base :: out |

ios_base :: trunc);

// ‚ивґд в файл

inout << "This is the story1 of a man" << endl;

inout << "This is the story2 of a man" << endl;

inout << "This is the story3 of a man" << endl;

char p [100];

// “становка покажчика файлу (позицґонуваннЯ) в його початок inout.seekg (0);

// —итаннЯ 1-го рЯдка (довжиною не бґльше 100 символґв)

inout.getline (p, 100);

// ‚иведеннЯ 1-го рЯдка на екран (stdout)

cout << endl << "String1:" << endl;

cout << p;

// ‡апам'ЯтовуваннЯ поточно» позицґ» у файлґ пґслЯ 1-го виведеннЯ

fstream :: pos_type pos = inout.tellg ();

// —итаннЯ 2-го рЯдка з файлу

inout.getline (p, 100);

// ‚ивґд 2-го рЯдка на екран (stdout)

cout << endl << "String2:" << endl;

cout << p;

// —итаннЯ 3-го рЯдка з файлу

inout.getline (p, 100);

// ‚иведеннЯ 3-го рЯдка на екран (stdout)

cout << endl << "String3:" << endl;

cout << p;

// “становка вказґвника перед 2-м рЯдком

inout.seekp (pos);

// ‡апис на мґсце 2-го рЯдка

inout << "This is the story2 of a man" << endl;

// ‡апис на мґсце 3-го рЯдка

inout << "This is the story3 of a man" << endl;

// “становка на початок файлу

inout.seekg (0);

// ‚ивґд всього вмґсту потоку на екран (stdout)

cout << endl << endl << inout.rdbuf ();

inout.close ();

system ("DEL FSTREAM.OUT");

getch ();

}

ђис. 2. ђезультати роботи програми лґстинга 9

Абота с классом ofstream

Љлас ofstream призначений длЯ органґзацґ» робґт з виведеннЯ (записи) у файл за допомогою методґв цього класу:

r open () - вґдкрива№ файл длЯ запису в нього ґнформацґ»;

r is_open () - поверта№ true, Якщо файл вґдкритий, ґ false - у протилежному випадку;

r put () - запису№ в файл один символ;

r write () - запису№ в файл задане число символґв;

r skeep () - перемґща№ покажчик позицґонуваннЯ в задане мґсце

файлу;

r tellp () - вида№ поточне значеннЯ покажчика позицґонуваннЯ;

r close () - закрива№ файл;

r rdbuf () - вида№ покажчик на буфер виводу (цей буфер знаходитьсЯ в структурґ, з Якою пов'Язу№тьсЯ файл при його вґдкриттґ).

“ лґстингу 10 приведений приклад використаннЯ класу ofstream.

‹ґстинг 10

ofstream FILE; /* оголошу№мо змґнну FILE типу ofstream

(‘творю№мо екземплЯр класу) */

FILE.open ("a.txt"); // виклика№мо метод вґдкриттЯ файлу

if (FILE == NULL) return (0); // невдале вґдкриттЯ файлу

for (int i = 0; i <2; i + +)

FILE << "string" << i << endl; // вивґд в файл

FILE.close (); // закриттЯ файлу

Обота з класом ifstream

Љлас ifstream призначений длЯ органґзацґ» робґт по введенню (читаннЯ) з файлу за допомогою методґв цього класу:

- open () - вґдкрива№ файл длЯ читаннЯ з нього ґнформацґ»;

- is_open () - поверта№ true, Якщо файл вґдкритий, ґ false - у протилежному випадку;

- get () - чита№ з файлу один символ;

- read () - чита№ з файлу задане число символґв;

- eof () - поверта№ ненульове значеннЯ, коли покажчик позицґонуваннЯ в файлґ досЯга№ кґнцЯ файлу;

- peek () - вида№ черговий символ потоку, але не вибира№ його (не зрушу№ покажчик позицґонуваннЯ даного в файлґ);

- seekg () - перемґща№ покажчик позицґонуваннЯ в задане мґсце

файлу;

- tellg () - вида№ поточне значеннЯ покажчика позицґонуваннЯ;

- close () - закрива№ файл;

- rdbuf () - вида№ покажчик на буфер введеннЯ (цей буфер знаходитьсЯ в структурґ, з Якою пов'Язу№тьсЯ файл при його вґдкриттґ).

Џриклад використаннЯ класу приведений в лґстингу 11.

‹ґстинг 11

ifstream FILE; /* оголошу№мо змґнну FILE типу ifstream (створю№мо екземплЯр класу) */

char p [100];

FILE.open ("a.txt"); // виклика№мо метод вґдкриттЯ файлу

if (FILE == NULL) return (0); // невдале вґдкриттЯ файлу

while (! FILE.eof ()) // перевґрка на ознаку кґнцЯ файлу {

FILE >> p; // читаннЯ з файлу

cout << p << endl; // вивґд прочитаних даних на екран

}

FILE.close (); // закриттЯ файлу

Ќаведемо програму роботи з файлами введеннЯ / виводу (лґстинг 12).

‹ґстинг 12

# Include <vcl.h>

# Include <iostream>

# Include <fstream>

# Include <conio.h>

# Define DelKey 's' / / цей символ буде вґддалЯтисЯ з потоку

# Define maxline 1000

// ------------------------------------------------ -------------------- # pragma argsused

int main (int argc, char * argv []) {

using namespace std; // використову№тьсЯ стандартне простґр ґмен

// Џеревґрка виведеннЯ

ofstream FILE;

FILE.open ("c: \\ a.txt", ios :: out);

char p [maxline];

int i, pos;

for (i = 0; i <2; i + +)

FILE << "string" << i; /* в даному випадку "<< endl" вводити не треба, ґнакше його потрґбно виводити, ґ цикл буде довший */

FILE.close ();

// Џеревґрка введеннЯ (читаннЯ по записах)

ifstream FILE1;

FILE1.open ("c: \ \ a.txt");

FILE1.seekg (0); /* перемґща№ покажчик у початок (при вґдкриттґ вґн ґ так буде на початку, але це просто длЯ демонстрацґ» роботи функцґ» seekg ()) */

if (FILE1 == NULL) / / перевґрка на помилку вґдкриттЯ файлу

return (0);

while (! FILE1.eof ()) // перевґрка кґнцЯ файлу {

FILE1 >> p >> i;

cout << p << i << endl;

}

FILE1.close ();

getch ();

// Џеревґрка посимвольного читаннЯ

ifstream FILE2;

char c;

FILE2.open ("c: \ \ a.txt");

if (FILE2 == NULL) // перевґрка на помилку вґдкриттЯ файлу

return (0);

while (! FILE2.eof ()) // перевґрка кґнцЯ файлу {

c = FILE2.peek (); /* буде лґчений наступний символ, але покажчик позицґонуваннЯ при цьому не зрушу№тьсЯ: залиша№тьсЯ на цьому символґ */

streampos cgp = FILE2.tellg (); /* визнача№тьсЯ поточна позицґЯ у файлґ */

if (c == DelKey) /* викидаютьсЯ всґ символи DelKey з читаного потоку */ {

pos = cgp + 1; // готу№мосЯ пропустити символ по seekg ()

FILE2.seekg (pos); /* пересунули покажчик позицґонуваннЯ на один символ далґ, щоб пропустити символ */

continue; // на продовженнЯ циклу

}

FILE2.get (c); // читаннЯ символу в с

cout << c;

} // While

cout << endl;

FILE2.close ();

getch ();

system ("DEL C: \ \ A.TXT"); // видаленнЯ робочого файлу

} // Main ()

Обота з бґнарним файлом

’акґ файли, на вґдмґну вґд потокових, створюютьсЯ в певнґй логґчнґй структурґ ґ тому повиннґ читатисЯ в змґнну тґ№» ж структури. Џриклад програми приведений в лґстингу 13.

лґстинг 13

# include <vcl.h>

# include <iostream> / / длЯ cin, cout

# include <fstream>

# include <conio.h>

# include <stdio.h>

void main () {

using namespace std; // використову№тьсЯ стандартне простґр ґмен

/* „анґ про спґвробґтникґв */

struct Blocknotes {

char name [30];

char phone [15];

int age;

} B [2] = {

"

}; // §нґцґалґзацґЯ масиву структур

// ‡апис даних в файл

ofstream FILE;

FILE.open ("Block", ios :: binary);

for (int i = 0; i <2; i++)

FILE.write ((char *) & b [i], sizeof (b [i]));

FILE.close ();

// —итаннЯ даних з файлу

ifstream FILE1;

FILE1.open ("Block", ios :: binary);

Blocknotes bb [2];

int i = 0;

while (! FILE1.eof ()) {

if (i == 2)

goto m;

FILE1.read ((char *) & bb [i], sizeof (bb [i]));

cout << "string" << i << "" << bb [i]. name << ""

<< Bb [i]. Phone << "" << bb [i]. Age << endl;

i++;

}

m:

FILE1.close ();

system ("DEL BLOCK");

getch ();

}

ЏоЯснень потребують такґ моменти:

- длЯ запису

FILE.write((char *)&b[i], sizeof(b[i]));

використову№тьсЯ функцґЯ буферґзґрованний виведеннЯ write (), в Якґй першим аргументом № вказґвник на структуру, з Яко» ми повиннґ записувати данґ. –ей вказґвник дорґвню№ адресою структури, тобто & b [i]. Ђле в потоцґ всґ данґ зберґгаютьсЯ побайтно, тому тип вказґвника char (тут йде примусове перетвореннЯ типу). „ругий аргумент - довжина запису. ‚она визнача№тьсЯ стандартною функцґ№ю sizeof ();

- за допомогою функцґ» system ("DEL BLOCK") вилуча№тьсЯ робочий файл;

- оператор goto застосований длЯ пґдстраховки вґд перевищеннЯ ґндексу масиву bb [].

ђезультат роботи програми наведений на рис. 3.

 

ђис. 3. ђезультат роботи програми лґстингу 13

‘тандартне введеннЯ/виведеннЯ в ‘++

‡агальнґ положенЯЯ

‘тандартне введеннЯ/виведеннЯ № окремим випадком файлового введеннЯ/виведеннЯ. Џри файловому введеннґ/виведеннґ ми оголошували екземплЯри вґдповґдних поточних класґв ґ потґм користувалисЯ методами ґ операцґЯми << ґ >>. Ђле Як ми бачили на початку цґ№» лекцґ», класи istream, ostream, що лежать в основґ потокових класґв, мґстЯть стандартнґ об'№кти-екземплЯри класґв з ґменами cout (екземплЯр класу длЯ стандартного введеннЯ), cin (екземплЯр класу длЯ стандартного виведеннЯ) ґ сerr (екземплЯр класу длЯ стандартного виводу повґдомлень про помилки). Џри запуску будь-Яко» програми на мовґ ‘++ цґ стандартнґ потоки визначенґ (вґдкритґ) ґ за замовчуваннЯм призначенґ на стандартне ввґдний пристрґй - клавґатуру (cin), на стандартне вивґдний пристрґй - екран (cout ґ cerr). Џричому всґ цґ пристро» синхронно пов'Язанґ з вґдповґдними вказґвниками stdin, stdout, stderr. ’ак що робота зґ стандартним введеннЯм/виведеннЯм зводитьсЯ до того, що замґсть ґмен примґрникґв вґдповґдних класґв, що задаютьсЯ користувачем, задаютьсЯ ґмена стандартних екземплЯрґв класґв: cin, cout. ‚ґдкривати нґчого не потрґбно, треба тґльки використовувати операцґ» <<, >> ґ операцґ» форматуваннЯ. џкщо ми пишемо ґмена змґнних, з Яких виводЯтьсЯ або в Якґ вводЯтьсЯ данґ, то за замовчуваннЯм длЯ введеннЯ/виведеннЯ використовуютьсЯ певнґ формати. Ќаприклад, запишемо:

cout << i;

“ цьому випадку значеннЯ i виведетьсЯ на екран у форматґ, визначеному за замовчуваннЯм длЯ типу i в мґнґмальному поле.

‡апишемо:

cin >> i >> j >> s;

де i, j, s описанґ вґдповґдно Як int, float, char. “ записґ ми не бачимо форматґв, але при введеннґ значень цих змґнних з клавґатури (пґслЯ введеннЯ кожного значеннЯ треба натискати клавґшу <Enter>) »х формати будуть врахованґ.

Тандартне виведеннЯ cout

Ћб'№кт cout направлЯ№ данґ в буфер-потґк, пов'Язаний з об'№ктом stdout, оголошеним у файлґ stdio.h. ‡а замовчуваннЯм стандартнґ потоки ‘ ґ ‘++ синхронґзованґ.

Џри виведеннґ данґ можуть бути вґдформатованґ за допомогою функцґй-членґв класу або манґпулЯторґв. Џерелґк »х наведено в табл. 4.

ЊанґпулЯтори, що починаютьсЯ з приставки "no" (noshowpos ґ т. п.) мають зворотню дґю по вґдношенню до манґпулЯторам з такими ж ґменами, але без "no". “ графґ "Ћпис" у таких манґпулЯторґв поставленґ прочерки.

’аблицЯ 4. ЊанґпулЯтори ґ функцґ» стандартного введеннЯ/виведеннЯ в ‘++

ЊанґпулЯтори ”ункцґ»-члени класу Ћпис
showpos setf (ios :: showpos) ‚ида№ знак плюс у виведених позитивних чисел
noshowpos unsetf (ios :: showpos) -
showbase setf (ios :: showbase) ‚ида№ базу системи численнЯ в виведеному числґ у виглЯдґ префґкса
noshowbase unsetf (ios :: showbase) -
uppercase setf (ios :: uppercase) ‡амґню№ символи нижнього регґстра на символи верхнього регґстру у вихґдному потоцґ
nouppercase unsetf (ios :: uppercase) -
showpoint setf (ios :: showpoint) ‘творю№ символ десЯтково» крапки в створеному потоцґ з плаваючою точкою (в виведеному числґ)
noshowpoint unsetf (ios :: showpoint) -
boolalpha setf (ios :: boolalpha) Џереклада№ булевий тип в символьний
noboolalpha unsetf (ios :: boolalpha) -
unitbuf setf (ios :: unitbuf) ‘кида№ буфер виводу пґслЯ кожно» операцґ» вивода
nounitbuf unsetf (ios :: unitbuf) -
internal setf (ios :: internal, ios :: adjustfield) „ода№ символи-заповнювачґ до певним внутрґшнґм позицґЯх вихґдного потоку (йдетьсЯ про виведеннЯ числа у виглЯдґ потоку символґв). џкщо такґ позицґ» не визначенґ, потґк не змґню№тьсЯ
left setf (ios :: left, ios :: adjustfield) „ода№ символи-заповнювачґ з кґнцЯ числа (зрушуючи число влґво)
right setf (ios :: right, ios :: adjustfield) „ода№ символи-заповнювачґ з початку числа (зрушуючи число вправо)
dec setf (ios :: dec, ios :: basefield) Џереклада№ базу вводЯтьсЯ або виводЯтьсЯ цґлих чисел у десЯткову (введенґ пґслЯ цього манґпулЯтора данґ будуть виводитисЯ Як десЯтковґ)
hex setf (ios :: hex, ios :: basefield) Џереклада№ базу вводЯтьсЯ або виводЯтьсЯ цґлих чисел в шґстнадцЯткову (введенґ пґслЯ цього манґпулЯтора данґ будуть виводитисЯ Як шґстнадцЯтковґ)
oct setf (ios :: oct, ios :: basefield) Џереклада№ базу вводЯтьсЯ або виводЯтьсЯ цґлих чисел у вґсґмкову (введенґ пґслЯ цього манґпулЯтора данґ будуть виводитисЯ Як вґсґмковґ)
fixed setf (ios :: fixed, ios :: floatfield) Џереклада№ вихґд з плаваючою крапкою в вихґд з фґксованою точкою
scientific setf (ios :: scientific, ios :: floatfield) ‚ида№ числа з плаваючою точкою у виглЯдґ, використовуваному в наукових цґлЯх: наприклад , число 23450000 буде записано Як: 23.45e6
  setbase (int base) Џеретворю№ введеннЯ цґлих чисел в тип base, де параметр base може бути одним з чисел 8, 10 або 16
fill (c) setfill (char_type c) ‡ада№ символ заповненнЯ при виведеннґ даних
precision (n) setprecision (int n) ‡ада№ точнґсть виведеннЯ даних (кґлькґсть цифр пґслЯ крапки)
setw (int n) width (n) ‡ада№ ширину полЯ длЯ виведених даних (кґлькґсть символґв)
endl   ‚ставлЯ№ символ нового рЯдка ('\n') у вихґдну послґдовнґсть символґв ґ скида№ буфер введеннЯ
ends   ‚ставлЯ№ символ '\0' в вихґдну послґдовнґсть символґв
flush flush () ‘кида№ буфер виведеннЯ ws ‡ада№ пропуск пробґлґв при введеннґ

‡наченнЯ за замовчуваннЯм:

- precision () - 6;

- width () - 0;

- fill () - пробґл.

Ќаведемо приклад програми ґз застосуваннЯм об'№кта cout (лґстинг 14).

“сґ поЯсненнЯ ви можете знайти в коментарЯх. ђезультат роботи програми представлений на рис. 4.

Ґстинг 14

// cout example

# Include <vcl.h>

# Include <iostream>

# Include <iomanip> // включеннЯ манґпулЯторґв

# Include <conio.h>

void main () {

using namespace std;

int i;

float f;

cout << "Enter i and f>" << endl;

// —итаннЯ цґлого числа ґ числа з плаваючою точкою з пристрою stdin

cin >> i >> f;

// ‚иведеннЯ цґлого ґ перехґд на новий рЯдок

cout << i << endl;

// ‚иведеннЯ числа з плаваючою точкою ґ перехґд на новий рЯдок

cout << f << endl;

// ‚иведеннЯ в шґстнадцЯтковґй системґ

cout << hex << i << endl;

// ‚иведеннЯ в вґсґмковґй ґ десЯткового системах

cout << oct << i << dec << i << endl;

// ‚иведеннЯ i з зазначеннЯм його знака

cout << showpos << i << endl;

// ‚иведеннЯ i в шґстнадцЯтковґй системґ

cout << setbase (16) << i << endl;

/* ‚иведеннЯ i в десЯтковґй системґ та доповненнЯ праворуч символом @ до ширини в 20 символґв (‡аповненнЯ почина№тьсЯ вґд право» межґ до лґво»). џкщо ви вводите 45, наприклад, то виведетьсЯ 45 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ */

cout << setfill ('@') << setw (20) << left << dec << i;

cout << endl;

// ‚иведеннЯ того ж результату в тому ж форматґ,

// Ђле з використаннЯм функцґй замґсть манґпулЯторґв

cout.fill ('@');

cout.width (20);

cout.setf (ios :: left, ios :: adjustfield);

cout.setf (ios :: dec, ios :: basefield);

cout << i << endl;

// ‚иведеннЯ f в науковґй нотацґ» з точнґстю - 10 цифр

cout << scientific << setprecision (10) << f << endl;

// ‡мґна точностґ до 6 цифр

cout.precision (6);

// ‚иведеннЯ f ґ поверненнЯ до нотацґ» з фґксованою точкою

cout << f << fixed << endl;

getch ();

}

ђис. 4. ђезультат работы программы листинга 14

Тандартне введеннЯ cin

Ћб'№кт (екземплЯр класу) cin управлЯ№ введеннЯм з буфера введеннЯ, пов'Язаного з об'№ктом stdin, оголошеним у файлґ stdio.h. ‡а замовчуваннЯм стандартнґ потоки в мовах ‘ ґ ‘++ синхронґзованґ. Џри введеннґ використову№тьсЯ частина тих функцґй ґ манґпулЯторґв, Якґ визначенґ длЯ cout. –е такґ манґпулЯтори, Як dec, hex, oct, ws та ґн.

Џриклад програми з використаннЯм об'№кта cin приведений в лґстингу 15.

Ґстинг 15

// Cin example # 1

# include <vcl.h>

# include <fstream>

# include <iostream>

# include <conio.h>

void main () {

using namespace std;

int i;

float f;

char c;

// ‚веденнЯ цґлого числа, числа з плаваючою точкою ґ символу з stdin

cout << "Enter i, f, c and then input the string>" << endl;

cin >> i >> f >> c;

// ‚ивґд i, f ґ c на stdout

cout << i << endl << f << endl << c << endl;

//

// Cin example # 2

//

char p [50];

// Ќаказ на видаленнЯ з введеннЯ всґх пробґлґв

cin >> ws >> p;

cout << p << endl;

// —итаннЯ символґв з stdin, поки не буде натиснута клавґша <Enter>

// Ђбо не будуть прочитанґ 49 символґв

cin.seekg (0);

cin.getline (p, 50);

// ‚иведеннЯ результату на stdout

cout << p << endl;

getch ();

}

ђезультат роботи програми наведено на рис. 5.

 

ђис. 5. ђезультат роботи програми лґстингу 15