Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мищишин електронка.doc
Скачиваний:
1
Добавлен:
08.12.2018
Размер:
1.04 Mб
Скачать

Ifstream output_file("filename.Ext", ios::out | ios::noreplace); виконання операцій читання і запису

Всі програми, представлені в даному розділі, виконували файлові операції над символьними рядками. В міру ускладнення програм, можливо, вам знадобиться читати і записувати масиви і структури. Для цього програми можуть використовувати функції read і write. При використовуванні функцій read і write ви повинні вказати буфер даних, в який дані читатимуться або з якого вони записуватимуться, а також довжину буфера, в байтах, як показано нижче:

Input_file.Read(buffer, sizeof(buffer));

output_file.write(buffer, sizeof(buffer));

Наступна програма STRU_OUT.CPP використовує функцію write для виведення вмісту структури у файл EMPLOYEE.DAT:

Void main(void)

{

struct employee {

char name[64];

int age;

float salary;

} worker = { "Джон Дой", 33, 25000.0 };

ofstream emp_flie("EMPLOYEE.DAT");

emp_file.write((char *) &worker, sizeof(employee));

}

Функція write звичайно одержує вказівник на символьний рядок. Символи (char *) є оператор приведення типів, який інформує компілятор, що ви передаєте вказівник на інший тип. Так само наступна програма STRU_IN.CPP використовує метод read для читання з файлу інформації про службовця:

Void main(void)

{

struct employee {

char name [64];

int age;

float salary;

} worker = { "Джон Дой", 33, 25000.0 };

Ifstream emp_file("employee.Dat");

emp_file.read((char *) &worker, sizeof(employee));

cout << worker.name << endl;

cout << worker.age << endl;

cout << worker.salary << endl;

}

35. Вбудовані функції і асемблерні коди

Якщо в програмі описується функція, то компілятор C++ переводить код функції в машинну мову, зберігаючи тільки одну копію інструкцій функції всередині програми. Кожного разу, коли програма викликає функцію, компілятор C++ розміщує в програму спеціальні інструкції, які заносять параметри функції в стек і потім виконують перехід до інструкцій цієї функції. Коли оператори функції завершуються, виконання програми продовжується з першого оператора, який слідує за викликом функції. Занесення аргументів в стек, перехід у функцію і вихід з неї вимагає часу, через це програма виконується трохи повільніше, ніж якби ті ж оператори були прописані просто всередині програми. Наприклад наступна програма CALLBEEP.CPP викликає функцію show_message, яка задане число раз видає сигнал на динамік комп'ютера і потім виводить повідомлення на дисплей:

Void show_message(int count, char *message)

{

int i;

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

cout << '\a';

cout << message << endl;

}

Void main(void)

{

show_message(3, "Вчимося програмувати на C++");

show_message(2, "Розділ 35");

}

Наступна програма NO_CALL.CPP не викликає функцію show_message. Натомість програма містить необхідні оператори всередині:

_

Void main(void)

{

int i;

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

cout << '\a';

cout << " Вчимося програмувати на C++" << endl;

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

cout << '\a';

cout << "урок 35" << endl;

}

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