Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod_pract_OTP-2004-ukr.doc
Скачиваний:
3
Добавлен:
17.11.2019
Размер:
964.1 Кб
Скачать

6 Введення / виведення інформації

6.1 Мета роботи

Вивчити й освоїти засоби введення/виведення засобами мови C.

6.2 Підготовка до роботи

Просте введення/виведення у файл.

Клас ofstream успадковує операції вставки від ostream, а ifstream успадковує операції витягу від istream. Вони також забезпечують конструктори й функції-компоненти для створення файлів і опрацювання введення/виведення в цей файл. Слід включати fstream.h в усі програми, де використовуються ці файли. Роздивимося такий приклад, у якому файл FILE_FROM копіюється в FILE_TO:

#include fstream. h

char ch;

ifstream f1("file_from");

if (! f1) errmsg("Cannot open 'filr_from' for input");

ofstream f2("file_to");

if (! f2) errmsg("Cannot open 'filr_to' for output");

while ( f2 && f1. get(ch) ) f2. put(ch);

Помилки, пов'язані з потоками, докладно обговорюються нижче.

Зазначимо: якщо конструктори ifstream або ofstream не можуть відкрити зазначені файли, то установлюється відповідний стан помилки потоку.

Конструктори дозволяють оголосити потік файла без задавання іменованого файлу. Потім ви можете асоціювати даний потік файла з конкретним файлом:

ofstream ofile; // створення вихідного потоку файлу

...

ofile. open("payroll"); // потік ofile асоціюється з файлом payroll

// робота з деяким паролем

ofile. close(); // payroll закривається

ofile. open("employee"); // потік ofile можна використувати повторно

За замовчанням файли відкривають у текстовому режимі. Це означає, що на запровадженні послідовність повернення каретки/перекладу рядка перетвориться в символ '\n'. Під час виведення символ '\n' перетвориться в послідовність повернення каретки/переклад рядка. У двійковому режимі такі перетворення не виконуються.

Функція компонента ofstream::open подається в такий спосіб:

void open(char * name, int=ios::out, int prot=filуbuf::openprot);

Аналогічно, оголошення ifstream::open має вигляд:

void open(char * name, int=ios::in, int prot=filуbuf::openprot);

Другий аргумент, названий режимом відкриття, має показані значення. Аргумент режиму відкриття (можливо, пов'язаний операцією АБО з декількома бітами режиму) можна задати в такій формі: (табл. 6.1).

Таблица 6.1.

Біт режиму

Дія

ios::app

Додавання даних – записування завжди в кінець файлу

ios::ate

Пошук кінця файлу після початкового відкриття

ios::in

Відкриття на введення (припускається для ifstream)

ios::out

Відкриття на виведення (припускається для ofstream)

ios::trunc

Знищення вмісту файла, якщо він існує (припускається, якщо ios::out задано, і ні ios::ate, ні ios::app не задані)

ios::nocreate

Якщо файл не існує, те open дає помилку

ios::noreplace

Якщо файл існує, open для файлів виведення дає помилку, якщо не встановлені ate або app

Мнемоніка режиму береться з перерахованого значення open_mode у ios:

class ios {

public:

enum open_mode { in, out, app, ate, nocreate, noreplace };

};

ofstream ofile("data",ios::app|ios::nocreate);

Оператор спробує відкрити файл DATA на виведення у режимі append; якщо файл не існує, це призведе до невдачі. Інформація щодо цієї невдачі буде позначена станом помилки ofile. У випадку вдалого завершення потік ofile буде доданий до файлу DATA. Клас fstream (похідний від двох класів ifstream і ofsrtream) може використовуватися для створення файлів, що одночасно дозволяють і введення, і виведення:

fstream inout("data:,ios::in|ios::out);

inout << i;

...

inout >> j;

Для визначення поточної позиції "get" або поточної позиції "put" файла можна скористатися функціями tellg і tellp. Вони визначають положення в потоці, де буде виконана така операція виведення або введення:

streampos cgp = inout. tellg(); // cgp – це поточна позиція get,

де streampos – це typedef у fstream.h. Функції–компоненти seekg і seekp можуть скидати значення поточної позиції get і put:

inout. seekg(cp); // встановлювання в “cp” поточній позиції "put"

Варіанти seekp і seekg дозволяють одержати шукані позиції у відносних зсувах:

inout. seekg(5,ios::beg); // переміщення cp на 5 байт від початку

inout. seekg(5,ios::cur); // переміщення cp на 5 байт вперед

inout. seekp(5,ios::end); // переміщення cp на 5 байт до кінця

Вам може знадобитися роздрукувати і вивчити файли заголовка, щоб дізнатися, чи взаємозалежні різноманітні класи потоків і як подаються їхні функції компоненти.

Під час використання бібліотеки класів С++ операції відкриття, створення і закриття виконуються при створенні об'єктів вихідного (вхідного) файлового потоку. Наприклад:

#include <iostream. h>

#include <fstream. h>//ofstream

#include <stdlib. h>//містить функцію exit

int main ()

{char sim;

ofstream myfile ("d:\oop\myfile. txt", ios:: out);//створюється файл, старий стирається

if (! myfile)

{

cerr<<" помилка відкриття myfile. txt'<<endl;

exit (1);

}

for (int i=1; i<10; i++) {

cout<<'введіть символ'<<endl;

cin>>sim;

myfile. put (sim);}

myfile<<endl;

return 0;

}

#include <iostream. h>

//#include <fstream. h>//ofstream

#include <fstream. h>

#include <stdlib. h>//містить функцію exit

int main ()

{char sim;

ifstream myfile ("d:\oop\myfile. txt", ios:: in);

if (! myfile)

{

cerr<<" помилка відкриття myfile. txt"<<endl;

exit (1);

}

int nsim=0, kolstr=0;

while (myfile. get (sim)) {

if (sim==char ("\n)")

kolstr++;

else

nsim++;

cout. put (sim);}

cout<<endl<<”kolstr=”<< kolstr<<”nsim=”<<nsim<<endl;

cin>>nsim;

return 0;

}

#include <iostream. h>

#include <fstream. h>//ofstream

#include <stdlib. h>//містить функцію exit

int main ()

{char sim;

ofstream myfile ("d:\oop\myfile. txt", ios:: in);//відкривається файл для читання

if (! myfile)

{

cerr<<" помилка відкриття myfile. txt"<<endl;

exit (1);

}

for (int i=1; i<10; i++) {

cout<<'введіть символ'<<endl;

cin>>sim;

myfile. put (sim);}

myfile<<endl;

return 0;

}

#include <iostream. h>

#include <fstream. h>//ofstream

#include <stdlib. h>//містить функцію exit

#define size 40

int main ()

{char sim, *filename;

cout<<”введіть ім'я файлу і шлях d:\oop\myfile. txt\n";

filename=new char (size);

cin. getline (filename, size);

ofstream myfile (filename, ios:: out);

if (! myfile)

{

cerr<<" помилка відкриття myfile. txt"<<endl;

cin>>sim;

exit (1);

}

for (int i=1; i<10; i++) {

cout<<”введіть символ”<<endl;

cin>>sim;

myfile. put (sim);}

myfile<<endl;

delete [] filename;

return 0;

}

6.3 Варіанти завдань до лабораторної роботи 6

Для всіх наведених нижче завдань, що передбачають опрацювання файлу з заданою структурою, написати програму для його створення.

1. У файлі зберігається інформація щодо зареєстрованих перездач заборгованостей студентами: ПІБ., предмет, кількість перездач. Сформувати файл за заданою ознакою (наприклад, за кількістю перездач) і видати його на екран дисплея.

2. Створити файл, у якому зберігається інформація щодо речей, вилучених на митниці за минулий період: дата вилучення, назва, кількість одиниць, вартість речей. Визначити кількість одиниць заданого типу предмета.

3. У файлі зберігається інформація щодо фінансової діяльності підприємств за минулий рік: назва підприємства, місяць, прибуток підприємства за цей місяць, нарахування на зарплату, прибуток підприємства. Сформувати файл, що має перелік підприємств, у яких позитивне ухилення від середньомісячного прибутку перевищує 50%.

4. Сформувати файл, у якому зберігаються результати сесії групи. Написати програму коректування оцінок у студентів, що перездали сесію.

5. У файлі зберігається інформація щодо пропусків занять студентами: ПІБ., предмет, стать, час заняття. Надійшла чергова інформація щодо пропусків. Написати програму й алгоритм розв’язання такої задачі: перевірити наявність у вихідному файлі повторних пропусків занять.

6. У файлі зберігається інформація щодо власників гаражного кооперативу: ПІБ., марка автомобіля, номер машини. Написати програму внесення у файл інформації щодо нових членів кооперативу, якщо дані про них відсутні у вихідному файлі.

7. У файлі зберігається інформація з заборгованостей студентами: ПІБ., група, курс, предмет. Написати програму видалення з файлу інформації щодо студентів, що анулювали заборгованості.

8. У файлі зберігається інформація щодо студентів, що одержали дозвіл на перездачу іспиту: ПІБ., група, предмет, курс. Сформувати файл, що містить інформацію щодо студентів, що одержали дозвіл на перездачу після заданої дати.

9. У файлі зберігається інформація щодо власників автотранспорту: ПІБ., марка автомобіля, номер машини. Написати програму формування файла, що містить інформацію щодо власників автомобілів, у номері яких зустрічаються задані цифри.

10. У файлі зберігається інформація щодо діяльності деяких підрозділів: назва підрозділу, кількість співробітників, прибуток, отриманий за поточний квартал. Визначити кращий підрозділ з урахуванням числа співробітників.

11. У файлі зберігається інформація щодо руху поїздів по станції «Харків–пасажирський»: номер поїзда, маршрут руху, час прибуття, час відправлення. Необхідно роздрукувати всі поїзди, що відправляються в заданому діапазоні часу.

12. У файлі зберігається інформація щодо фінансової діяльності підприємств за минулий рік: назва підприємства, місяць, прибуток підприємства за цей місяць, нарахування на зарплату, прибуток підприємства. Відсортувати цей файл у порядку зменшення прибутку і вивести на екран інформацію щодо трьох найбільш прибуткових підприємств.

13. У файлі зберігається інформація щодо руху поїздів по станції «Харків–пасажирський»: номер поїзда, маршрут руху, час прибуття, час відправлення. На його базі сформувати новий файл, що містить інформацію щодо поїздів, які рухаються в заданий кінцевий пункт.

14. Сформувати файл, у якому зберігається інформація щодо асортименту продовольчих товарів у комерційних магазинах: код (назва) магазина, назва товару, кількість цього товару, ціна за кілограм. Підібрати магазин або магазини для оптової закупівлі заданого товару в заданій кількості так, щоб зменшити затрати на його придбання.

15. Створити файл, в якому зберігається інформація щодо речей, вилучених на митниці за минулий період: дата вилучення, назва, код предмета (зброя, продовольчі товари, т.д.), кількість одиниць, вартість одиниці. Визначити групу речей, які найчастіше вилучалися.

16. Сформувати файл, у якому зберігається інформація щодо співробітників підрозділів: ПІБ., місце народження, рік народження. На його основі сформувати файл співробітників, що народилися в даному місті і роздрукувати.

17. Створити файл, у якому зберігається інформація щодо абонентів АТС: ПІБ., місце проживання, номер телефону. Необхідно упорядкувати перелік абонентів у файлі за алфавітом.

18. У файлі зберігається інформація щодо ліцензій, виданих на придбання газової зброї: ПІБ., дата видачі ліцензії, тип зброї, її вартість. Необхідно вивести на екран усі записи з заданою вартістю.

19. Сформувати файл, у якому зберігається інформація щодо академічних заборгованостей по факультетах за три роки. Написати програму визначення факультету з максимальною і мінімальною кількістю заборгованостей.

20. Сформувати файл, у якому зберігається інформація щодо асортименту продовольчих товарів у комерційних магазинах: код (назва) магазина, назва товару, кількість цього товару. Підібрати магазин, у якому зберігається заданий товар у потрібній кількості.

21. Створити файл, у якому зберігається інформація щодо абонентів АТС: ПІБ., місце проживання, номер телефону. Необхідно написати програму, що на прізвище видасть номер абонента.

22. Сформувати файл, у якому зберігається інформація щодо захворювань співробітників: ПІБ., рік народження, захворювання, тривалість хвороби. На його основі сформувати файл співробітників, що перенесли одне і те ж захворювання декілька разів.

23. Створити файл, у якому зберігається інформація щодо абонентів бібліотеки: ПІБ., кафедра, кількість книг взятих абонентом. Необхідно написати програму визначення кафедри яка заборгувала максимальну кількість книг.

24. Сформувати файл, у якому зберігаються результати сесії групи. Написати програму нарахування стипендії за результатами сесії.

25. У файлі зберігається інформація щодо винахідницької діяльності кафедр за три роки: назва кафедр, кількість заявок, кількість позитивних рішень. Написати програму визначення кафедри, яка здобула максимальну кількість позитивних рішень.

Додаток А

ПРИКЛАДИ ФУНКЦІЙ З ПАКЕТУ STRING.H.

void*memchr (const void*_s, int_c, size_t_n);

Функція шукає заданий символ ‘c’ в блоку пам'яті, на початок якого вказує s,

розміром n байт. Якщо символ ‘c’ знайдений, функція повертає покажчик на цей символ і якщо немає, null.

int memcmp (const void*s1, const void*_s2, size_t_n);

Функція порівнює size_t_n байт двох буферів, на початок яких вказують s1 і s2. Функція повертає значення: менше нуля, якщо s1<s2; дорівнює нулю, якщо s1==s2; більше нуля, якщо s1>s2.

void*memcpy (void*_dest, const void*_src, size_t_n);

Функція копіює n байтів з буферу, на початок якого вказує src, в буфер на початок якого вказує dest. Буфери не мають перемикатися в пам'яті. Функція повертає покажчик dest.

void*memmove (void*_dest, const void*_src, size_t_n);

Функція аналогічна функції memcpy, але буфери джерела і приймальника можуть перемикатися.

void*memset (void*_s, int_c, size_t_n);

Функція встановлює n байтів буфера в задане значення ‘c’ і повертає покажчик на буфер s.

char*strcat (char*_dest, const char*_src);

Функція реалізує «зціплення» рядка dest з рядком src. Функція вертає покажчик на початок отриманого рядка (dest). Проміжний символ‘\0’ рядка dest «гаситься».

char*strchr (const char*_, int_c);

Функція вертає покажчик на позицію першого входження символу ‘c’ в рядок, на який вказує s. В рядок s включається і символ ‘\0’.

int strcmp (const char*_s1, const char*_s2);

Функція виконує порівняння двох рядків, на початок яких вказують s1 і s2. Функція повертає значення: менше нуля, якщо s1<s2; дорівнює нулю, якщо s1==s2; більше нуля, якщо s1>s2.

size_t strcspn (const char*–s1, const char*_s2);

Функція зіставляє кожний символ рядка s1 з всіма символами рядка, на які вказує s2. Повертає довжину сегмента s1, який складається тільки з символів, що не входять в s2. Довжина відраховується від кожного рядка s1. Якщо рядок s1 починається з символу, що зустрічається в рядку s2, повертається нуль. Якщо s1 не містить жодного символу рядка s2, то вертається значення ,що співпадає з довжиною рядка s1. Нуль–термінатор у порівнянні не бере участь.

char*strerror (int_errnum);

За значенням аргументу errnum відшукується повідомлення щодо системної помилки. Значення errnum використовується як індекс у внутрішній таблиці рядків повідомлень щодо помилку. На початок таблиці вказує проголошена в файлі заголовку stdlib. h зовнішня змінна sys_errlist. Наприклад:

int strlen (const char*_s);

Функція по вертає довжину рядка в байтах, на яку вказує s. Нуль–терминатор не враховується

char*strncat (char*_dest, const char*_src, size_t_maxlen);

Приєднує maxlen символів з рядка, на який вказує src, до рядка, на який вказує dest. Рядок dest має містити не менше maxlen вільних байтів. Якщо maxlen більше рядка src, виконується проста конкатенація.

int strnсmp (const char*_s1, const char*_s2, size_t_maxlen);

Функція аналогічної функції strcmp () і відрізняється тим, що виконується порівняння перших maxlen байтів.

char*strncpy (char*_dest, const char*_src, size_t_maxlen);

Функція копіює maxlen байт з рядка, на який вказує src, в інше місце в пам'яті, на що вказує dest. Нуль–термінатор теж копіюється. Якщо maxlen менш довжини рядка src, до рядка src не приєднується символ“\0”. І якщо більше, то рядок src переноситься повністю, а символи, що залишалися, заповнюються символом “\0”. Функція повертає покажчик dest.

int memicmp (const void *_s1, const void *_s2, size_t_n);

Функція порівнює n байт двох буферів на що вказують s1 і s2. Функція повертає значення: менше нуля, якщо s1<s2; дорівнює нулю, якщо s1==s2; більше нуля, якщо s1>s2.

char*stpcpy (char *_dest, const char *_src);

Функція копіює рядок, на котрий вказує src, в інше місце в пам'яті, на що вказує dest.

int stricmp (const char *_s1, const char *_s2);

Функція виконує порівняння двох рядків, на що вказують s1 і s2. Перед порівнянням символи перетворюються в малі. Функція повертає значення: більше нуля, якщо s1>s2; дорівнює нулю, якщо s1==s2; менше нуля, якщо s1<s2.

int strnicmp (const char *_s1, const char *_s2, size_t_u);

Функція аналогічної функції stricmp, за винятком того, що порівняння обмежене size_t_u символами.

char *strset (char *_s, int_ch);

Функція заповнює рядок, на початок якого вказує s, символом ch. Функція повертає покажчик на отриманий рядок.

ПЕРЕЛІК ПОСИЛАНЬ

1.Бритік В.І, Мегель Ю.Е. Програмування об'єктно-орієнтованою мовою С++: Навч. посібник для вузів – К.,2001. – 425с.

2.Касаткин А.И, Вальвачёв А.Н. Профессиональное программирование на языке Си: От turbo C к borland C++: Справ. пособие / Под ред. А. И. Касаткина. – Мн.: Выш. шк., 1992. – 240c.

3.Пол Ир Объектно-ориентированное программирование с использованием С++: Пер. с англ. – К.: НИПФ «ДиаСофт Лтд», 1995. – 480c.

4.Том Сван. Освоение Borland C++ 5. – К: Диалектика, 1996. – 576c.

5.Лукас П. C++ под рукой: Пер. с англ. – Киев: «ДиаСофт», 1993. – 176c.

47