Ћтже, ми визначили, що потоковґ класи - це постачальники ґнструментґв длЯ роботи з файлами. “ потокових класах зберґгаютьсЯ:
- структури, що забезпечують вґдкриттЯ/закриттЯ файлґв;
- функцґ» (методи) вґдкриттЯ/закриттЯ файлґв;
- ґншґ функцґ» ґ данґ, що забезпечують, Як ми побачимо далґ, власне ввґд/вивґд.
Ростґр ґмен
Ѓагато серйозних додаткґв складаютьсЯ з декґлькох програмних файлґв (з вихґдним текстом програм), Якґ створюютьсЯ ґ обслуговуютьсЯ окремими групами програмґстґв. § тґльки пґслЯ цього всґ файли збираютьсЯ в загальний проект. Ђле Як бути з тим фактом, що в таких файлах можуть бути однаково оголошенґ рґзнґ змґннґ? “ ‘++ це незручнґсть дозволЯ№тьсЯ за допомогою так званих просторґв ґмен, що вводЯтьсЯ в кожен текстовий програмний файл проекту за допомогою директиви:
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