Файли з даними типу масиви

Розглянемо на конкретних прикладах — від простого до більш складного — обробку файлів, що містять дані — масиви.

Приклад 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( ) не набуде значення «істина». Інші оператори зрозумілі з тексту програмного коду.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *