Розглянемо на конкретних прикладах — від простого до більш складного — обробку файлів, що містять дані — масиви.
Приклад 16.1. Потрібно записати у файл з ім’ям «filel.dat» 10 дійсних чисел, створити з цих чисел масив.
Для цього треба кожне число спочатку ввести з клавіатури в оперативну пам’ять комп’ютера, а потім записати його у файл. Для введення скористаємося функцією InputBox(). Розташуємо на формі дві кнопки: одну — типу Button — для ініціювання команди «Ввод», іншу — типу BitBtn з написом «Close» — для закінчення роботи додатка. Вигляд форми, вікна введення і програмного коду наведено нижче:
С++: Розв’язання задач з файлами
#include <vcl.h> #pragma hdrstop #include <Dialogs.hpp> #include <fstream.h> #include "UnFile.h" //-------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //-------------------------------- _ fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //-------------------------------------------------------------- void _fastcall TForm1::Button1Click(TObject *Sender) { AnsiString p; int i; ofstream fp("d:\\Users\\Dat_base\\filel.dat"); if (!fp) { ShowMessage("Файл не открыт"); return; } for (ї=1; і <= 10; i++) { // ввод в ОЗУ с помощью клавиатуры очередного числа р=ІnрutВох("Ввод чисел","Введите "+IntToStr(i)+" число"," "); fp << StrToFloat(p)<<' '; // запись числа из ОЗУ в файл } fp.close(); }
У заголовні файли програмного коду треба включити два файли: #include <Dialogs.hpp> і #include <fstream.h>. Перший з них забезпечує доступ до функції InputBox(), а другий — містить засоби роботи з файлами.
Ім’я створюваного файла з урахуванням шляху має вигляд:
“d:\\Users\\Dat_base\\file.dat”.
Конструктор ofstream() створює потік з ім’ям fp для запису даних у файл, що і використовується в циклі for. Оператор if у цій програмі служить для визначення виконання операції відкриття файла. Якщо ця операція з якихось причин не виконалася, у вікні ShowMessage() буде виведено повідомлення: «Файл не открыт», і оброблювач припинить подальшу роботу. У протилежному випадку в папці «Dat_base», що створена у каталозі Users на диску D:, буде розташований файл з ім’ям “file1.dat“, у який запишеться 10 чисел.
Приклад 16.2. Із 10 дійсних чисел, що записані у файл з ім’ям «filel.dat» (розглянутий вище приклад 16.1), створити масив і відсортувати його за зростанням значень.
Для розв’язання поставленої задачі необхідно створити відповідний додаток.
Відкриємо нову форму і розмістимо на ній компоненти:
- Label1 — для виведення заголовка «Исходный массив»;
- Label2 — для виведення значень елементів масиву;
- Label3 — для виведення заголовка «Отсортированный массив»;
- Label4 — для виведення значень цього масиву;
- кнопку Button1 з написом «Выполнить» — для створення події читання файла в масив, його сортування і виведення;
- кнопку BitBtn2 з написом «Close» для закриття додатка.
Форма і додаток мають вигляд:
С++: Розв’язання задач з файлами
#include <vcl.h> #pragma hdrstop #include< fstream.h> #include "Un_Read.h" //---------------------------------------------------------------------------------------------------------------------- #pragma package(smartinit) #pragma resource "*.dfm" TForm1 *Form1; //------------------------------------------------------------------------ fastcall TForm1: :TForm1 (TComponent* Owner) : TForm(Owner) { void_fastcall TForm1 ::Button1Click(TObject *Sender) { float mas [10]; // описание массива int i=0; ifstream inp("d:\\Users\\Dat_Base\\filel.dat"); //открытие файла if (!mp) { ShowMessage("Файл не открывается"); return; } Label2->Caption=""; // очистка поля ввода метки Label2 while(!inp.eof()) //цикл работает пока eof() имеет значение fake { inp>>mas[i]; // чтение чисел из файла в массив //---------------------------------- вывод исходного массива Label2->Caption=Label2->Caption+ FloatToStrF(mas[i],ffFixed,5,1)+" "; i++; } inp.close(); //--------------------------------------- сортировка массива for (int k = 0; k < 10-1; k++) for (і = 0; і < 10-k-1; i++) if (mas[i]>mas[i+l]) { float buf=mas[i]; //запись элемента массива в переменную buf mas[i] = mas[i+l]; mas[i+l] = buf; } //--------------------------- вывод отсортированного массива Label4->Caption=" "; for (і = 0; і < 10; i++) Label4->Caption=Label4->Caption+ FloatToStrF(mas[i],ffFixed,5,1)+" "; }
У додатку організація операції читання здійснюється оператором while(!inp.eof). Цей оператор забезпечує читання компонентів файла за допомогою потоку з ім’ям іnр у масив mas[ ] доти, поки не зустрінеться маркер кінця файла, тобто функція eof( ) не набуде значення «істина». Інші оператори зрозумілі з тексту програмного коду.