Лабораторная работа № 11
Запись и чтение блоков из двоичного файла (произвольный доступ).
Цель: Научится работать с двоичными файлами в режиме произвольного доступа.
Задача: Создать приложение с формой, которая записывает массив в файл, затем считывает массив из файла с заданной позиции. Организовать функцию выхода из программы.
Порядок выполнения:
- Создать проект с формой.
- Задать имя формы Name=Form1
- Задать надпись в верхней части окна Form1->Caption= “Запись и чтение блоков из файла (произвольный доступ) ”
- На форму вынести элемент главного меню, задать пункт Файл-Выход и действие Form1->Close();
- На форму вынести элемент Memo: Name= Memo1. Очистить окно Memo1 (Memo->Lines).
- На форму вынести 3 кнопки Button: 1) Name= Button1, Caption=“Запись”, 2) Name= Button2, Caption=“Чтение”, 3) Name= Button3, Caption=“Очистить окно Вывода”
- На событие OnClick кнопки Button1 записать код:
int N[5]={1,2,3,4,5};
Memo1->Clear();
ofstream outfile("test3.dat", ios::out|ios::binary);
if (!outfile) {
ShowMessage("Файл не удается создать");
return ;
}
outfile.write((char *)&N, sizeof N);
Memo1->Lines->Add("В файл записано:");
Memo1->Lines->Add("1 2 3 4 5 ");
outfile.close();
- На событие OnClick кнопки Button2 записать код:
int K[5];
int Pos;
char str[30];
ifstream infile("Test3.dat", ios::in|ios::binary);
if(!infile)
{
ShowMessage("Файл не удается открыть");
return;
}
Memo1->Lines->Add("Начальная позиция");
Pos=infile.tellg();
Memo1->Lines->Add(IntToStr(Pos));
infile.seekg(12,ios::beg); //смещение на 12 байт (3 целых числа) отн. нач. файла
Memo1->Lines->Add("Позиция после сдвига");
Pos=infile.tellg();
Memo1->Lines->Add(IntToStr(Pos));
infile.read((char *)&K, sizeof K);
Memo1->Lines->Add("Прочитанные из файла данные");
sprintf(str," %i %i ", K[0], K[1]);
// закрытие файла
infile.close();
Memo1->Lines->Add(str);
Memo1->Lines->Add("Позиция после чтения");
Pos=infile.tellg();
Memo1->Lines->Add(IntToStr(Pos));
- На событие OnClick кнопки Button3 записать код: Memo1->Clear();
- Подключить модули <stdio.h>, <fstream.h>
Пояснения к коду программы:
Подключаемые модули:
#include <stdio.h>//подключаются функции форматированного вывода sprintf
#include <fstream.h> //для использования функций ofstream ifstream
На кнопку Запись:
int N[5]={1,2,3,4,5}; //объявляется целочисленный массив N на 5 элементов и задаются значения
Memo1->Clear(); //очистить многострочное окно редактирования
ofstream outfile("test3.dat", ios::out|ios::binary); /* открывается выходной поток outfile для двоичного вывода в файл test3.dat */
if (!outfile) { //если не outfile на открывается то
ShowMessage("Файл не удается создать"); //вывести сообщение
return ; //и выйти из функции
}
outfile.write((char *)&N, sizeof N); /*вывести в outfile двоичный блок соответствующий размеру массива N, начиная непосредственно с адреса расположения N в памяти (указатель приводиться к типу char)*/
Memo1->Lines->Add("В файл записано:"); /* символьная строка добавляется в многострочное окно редактирования как новая строка */
Memo1->Lines->Add("1 2 3 4 5 "); /* символьная строка добавляется в многострочное окно редактирования как новая строка */
outfile.close(); //закрыть поток outfile (закрыть файл)
На кнопку Чтение:
int K[5]; //объявляется целочисленный массив N на 5 элементов
int Pos; //объявляется целочисленная переменная Pos
char str[30]; //объявляется симвльный массив str размером в 30 элементов
ifstream infile("Test3.dat", ios::in|ios::binary); /* открывается входной поток outfile для двоичного ввода из файла test3.dat */
if(!infile) //если поток не открывается то
{
ShowMessage("Файл не удается открыть"); //выдать сообщение
return; //и выйти из функции
}
Memo1->Lines->Add("Начальная позиция"); /* символьная строка добавляется в многострочное окно редактирования как новая строка */
Pos=infile.tellg(); //положение указателя входного потока записывается в Pos
Memo1->Lines->Add(IntToStr(Pos)); //значение указателя выводится в Memo1
infile.seekg(12,ios::beg); //смещение на 12 байт (3 целых числа) отн. нач. файла
Memo1->Lines->Add("Позиция после сдвига"); /* символьная строка добавляется в многострочное окно редактирования как новая строка */
Pos=infile.tellg(); //положение указателя входного потока записывается в Pos
Memo1->Lines->Add(IntToStr(Pos)); //значение указателя выводится в Memo1
infile.read((char *)&K, sizeof K); /*ввести из intfile в массив двоичный блок соответствующий размеру массива K, начиная непосредственно с адреса расположения K в памяти (указатель на массив приводится к типу char )*/
Memo1->Lines->Add("Прочитанные из файла данные"); /* символьная строка добавляется в многострочное окно редактирования как новая строка */
sprintf(str," %i %i ", K[0], K[1]); // в str вывести значения K[0], K[1]
infile.close(); // закрытие файла
Memo1->Lines->Add(str); /*значение str вывести как новую строку в многострочное окно редактирования Memo1*/
Memo1->Lines->Add("Позиция после чтения"); /* символьная строка добавляется в многострочное окно редактирования как новая строка */
Pos=infile.tellg(); //положение указателя входного потока записывается в Pos
Memo1->Lines->Add(IntToStr(Pos)); //значение указателя выводится в Memo1
Кнопку Очистить окно Memo:
Memo1->Clear(); //очистить многострочное окно редактирования
Главное меню:
Form1->Close(); //закрыть форму Form1 (закрыть программу)
Анимация выполнения работы:
Pr11.exe (9 MБ) Скачать