Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 9 (Файли).docx
Скачиваний:
29
Добавлен:
16.05.2015
Размер:
64.85 Кб
Скачать

Виведення у файловий потік

У мові С++ введення/виведення описується як набір класів, описаний в заголовному файлі iostream.h. Аналогами потоків stdin, stdout, stderr є класи cin, cout і cerr. Ці три потоки відкриваються автоматично. Потік cin пов'язаний з клавіатурою, а cout, cerr - з дисплеєм.

Класи iostream використовують перевантажені операції: "<<" – для занесення (запису) в потік; ">>" – для вилучення (читання) з потоку.

Обидві операції повертають посилання на тип iostream, що дозволяє об'єднувати в одному рядку кілька потокових операцій. Існують перевантажені операції для всіх типів даних, тим самим необхідність перевірки відповідності типів відпадає. Компілятор самостійно вибирає потрібну операцію відповідно до типу даних:

int ivalue; float fvalue; char c; cin>> ivalue>> fvalue>> c; cout <<"integer:"<<ivalue<<endl <<"float:" <<fvalue <<"char:"<<c;

Для форматування виведених даних для об'єктів iostream включені наступні методи:

precision (int p) - кількість знаків після коми, width (int w) - розмір поля для висновку, setf (long manip) - установка прапорів, що визначають формат виводу

Запис у вихідний файловий потік

Заголовний файл <fstream.h> визначає клас вихідного файлового потоку з ім'ям ofstream. Використовуючи об'єкти класу ofstream, ваші програми можуть виконувати виведення у файл. Для початку слід оголосити об'єкт типу ofstream, вказавши ім'я необхідного вихідного файлу як символьну рядок, що показано нижче:

ofstream file_object ("FILENAME.EXT");

Якщо вказати ім'я файлу при оголошенні об'єкту типу ofstream, C++ створить новий файл на диску, використовуючи вказане ім'я, або перезапише файл з таким же ім'ям, якщо він вже існує на вашому диску. Наступна програма створює об'єкт типу ofstream і потім використовує оператор вставки для виведення декількох рядків тексту в файл BOOKINFO.DAT:

# include <fstream.h> void main (void) {  ofstream book_file ("BOOKINFO.DAT");    book_file <<"Вчимося програмувати на мові C + +," <<"Друга редакція\n";    book_file <<"Jamsa Press" <<endl;    book_file <<"22.95" <<endl; }

У даному випадку програма відкриває файл BOOKINFO.DAT і потім записує три рядки у файл, використовуючи оператор вставки.

Читання з вхідного файлового потоку

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

ifstream input_file ("filename.EXT");

Наступна програма FILE_IN.CPP відкриває файл BOOKINFO.DAT, який ви створили за допомогою попередньої програми, і читає, а потім відображає перші три елементи файлу:

# include <iostream.h> # include <fstream.h> void main (void) {  ifstream input_file ("BOOKINFO.DAT");    char one [64], two [64], three [64];    input_file>> one;    input_file>> two;    input_file>> three;    cout <<one <<endl <<two <<endl <<three <<endl; }

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

С: \> FILE_IN <ENTER> вчимося програмувати на …

Читання цілого рядка файлового введення

Програми можуть використовувати cin.getline для читання цілого рядки з клавіатури. Подібним чином об'єкти типу ifstream можуть використовувати getline для читання рядки файлового введення. Наступна програма використовує функцію getline для читання всіх трьох рядків файлу BOOKINFO.DAT:

void main (void) {    ifstream input_file ("BOOKINFO.DAT");    char one [64], two [64], three [64];    input_file.getline (one, sizeof (one));    input_file.get line (two, sizeof (two));    input_file.getline (three, sizeof (three));    cout <<one <<endl;    cout <<two <<endl;    cout <<three <<endl; }

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

Визначення кінця файлу

Звичайною файлової операцією в ваших програмах є читання вмісту файлу, поки не зустрінеться кінець файлу. Щоб визначити кінець файлу, ваші програми можуть використовувати функцію еоf потокового об'єкта. Ця функція повертає значення 0, якщо кінець файлу ще не зустрівся, і 1, якщо зустрівся кінець файлу. Використовуючи цикл while, програми можуть безперервно читати вміст файлу, поки не знайдуть кінець файлу, як показано нижче:

while (! input_file.eof ()) { …..    / / Оператори ………}

У даному випадку програма буде продовжувати виконувати цикл, поки функція eof повертає false (0). Наступна програма TEST_EOF.CPP використовує функцію eof для читання вмісту файлу BOOKINFO.DAT, поки не досягне кінця файла:

void main (void) {   ifstream input_file ("BOOKINFO.DAT");    char line [64];    while (! input_file.eof ())    {  input_file.getline (line, sizeof (line));       cout <<line <<endl;

 }}

Аналогічно, наступна програма читає вміст файлу по одному слову за один раз, поки не зустрінеться кінець файлу:

void main (void) {  ifstream input_file ("BOOKINFO.DAT");    char word [64];    while (! input_file.eof ())    {  input_file>> word;       cout <<word <<endl;  }

}

І нарешті, наступна програма читає вміст файлу по одному символу за один раз, використовуючи функцію get, поки не зустріне кінець файлу:

void main (void) { ifstream input_file ("BOOKINFO.DAT");    char letter;    while (! input_file.eof ())    {   letter = input_file.get ();       cout <<letter;   }

}