Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

c++, Matlab

.pdf
Скачиваний:
98
Добавлен:
30.03.2015
Размер:
1 Mб
Скачать

19.Закрыть экранную форму.

20.Разместить на форме один компонент ProgressBar [1]. Далее будем использовать следующее имя компонента: ProgressBar1. Примерный вид окна после размещения указанных компонентов показан на рис. 5.10.

Рис. 5.10

21. В обработчике события OnClick компонента Button1 разместить следующий программный код (добавить к имеющемуся):

ProgressBar1>Position=100*25/100;

Sleep(500);

ProgressBar1>Position=100*50/100;

Sleep(500);

ProgressBar1>Position=100*75/100;

Sleep(500);

ProgressBar1>Position=100;

22.Откомпилировать и выполнить разработанное ПО. Проект считать успешно откомпилированным при отсутствии сообщений об ошибках в процессе компиляции.

23.В окне Form1 нажать кнопку Button1. После выполнения данного действия в окне Form1 должен отображаться ход длительного процесса.

51

Контрольные вопросы

1.В каких случаях в текст программы следует включать текст файла Math.h?

2.Приведите последовательность команд на языке С++, необходимую для построения графика функции с помощью компонента Chart. Поясните назначение каждой приведенной команды.

3.Перечислите и опишите основные методы и свойства компонента Chart.

4.Приведите последовательность команд на языке С++, необходимую для отображения хода длительного процесса с помощью компонента ProgressBar. Поясните назначение каждой приведенной команды.

5.Как производится выбор типа графика, отображаемого компонентом Chart?

6.Перечислите и опишите основные методы и свойства компонента Prog-

ressBar.

7.Какое назначение имеет компонент Chartfx среды C++ Builder 6?

8.Назовите и кратко опишите компоненты среды C++ Builder 6, предназначенные для создания графиков и диаграмм.

9.Какое назначение имеет компонент СGauge среды C++ Builder 6?

10.Перечислите и опишите основные методы и свойства компонента СGauge.

Библиографический список

1.Архангельский А. Я. Программирование в C++ Builder 6 / А. Я. Архан-

гельский. – М. : Бином, 2003. – 1152 с.

2.Архангельский А. Я. C++ Builder 6 : справ. пособие. Книга 2. Классы

икомпоненты / А. Я. Архангельский. – М. : Бином-Пресс, 2002. – 528 с.

3.Лафоре Р. Объектно-ориентированное программирование в C++ / Р. Ла-

форе. – СПб. : Питер, 2007. – 928 с.

4.Подбельский В. В. Язык С++ : учеб пособие / В. В. Подбельский. – 5-е изд. – М. : Финансы и статистика, 2003. – 562 с.

52

ЛАБОРАТОРНАЯ РАБОТА 6

ЧТЕНИЕ И ЗАПИСЬ ФАЙЛОВ В СРЕДЕ С++ BUILDER

Цель работы – изучение функций программной среды C++ Builder 6, предназначенных для работы с текстовыми и бинарными файлами.

Задание к работе

1.Изучить функции среды С++ Builder 6, предназначенные для работы

стекстовыми и бинарными файлами.

2.В программной среде C++ Builder 6 разработать ПО, выполняющее чтение и запись бинарных файлов.

3.Выполнить запись и чтение бинарного файла.

4.Сделать выводы по результатам работы.

Пояснения к работе

Внастоящее время под файлом понимается определенная взаимосвязанная

иупорядоченная совокупность данных [3, 5]. Для того чтобы файл мог быть идентифицирован, совокупность данных обязательно должна иметь описание, т. е. уникальное имя и некоторые другие сведения (размер, дату создания и т. д.). С точки зрения программного обеспечения файл представляет собой именованную область внешней памяти ПК.

Впрограммной среде С++ Builder 6 работа с файлами может осуществляться несколькими различными способами [1, 2]. В первую очередь работа с файлами может производиться с использованием библиотечных компонентов. Множество классов среды С++ Builder 6 содержит в себе методы работы с фай-

лами LoadFromFile и SaveToFile. Кроме того, среда также может работать с файлами как с потоками [1, 6]. Работа с файлами как с потоками может выполняться с помощью нескольких дублирующих друг друга функций. В частности, в среде предусмотрена возможность работы с функциями в стилях C и C++ [1, 2, 4, 6].

В настоящее время, с точки зрения разработчика ПО, различаются два типа файлов: бинарные и текстовые.

53

Текстовые файлы предназначены для хранения текстовых данных. Текстовый файл трактуется в С++ как совокупность символьных строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстовых файлов в конце каждой строки ставится специальный разделитель «\n», а в конце всего файла – признак конца файла [1]. Для доступа к информации в текстовом файле применяются процедуры fprintf, fgets

и fgetc [1, 7].

Двоичный (бинарный) файл представляет собой последовательность символов, записанную без каких-либо разделителей. В отличие от текстового файла при записи бинарного файла не используются символы конца строки и другие разделяющие символы. Что именно и в какой последовательности хранится в файле, должен знать программист. Двоичные файлы, как правило, имеют меньший объем по сравнению с текстовыми. В них можно хранить данные любого формата и любой длины.

Рассмотрим файловый ввод/вывод с помощью потоков в стиле С [1]. Для работы с файлами в С определён особый тип данных FILE. Переменные типа FILE представляют собой структуры, которые содержат информацию о файлах. Данная информация используется для выполнения различных операций над файлами.

Файлы становятся доступными программе только после выполнения процедуры открытия файла. Эта процедура заключается в создании переменной типа FILE и увязывании ее с именем создаваемого (или уже существующего) файла. При открытии файла указывается характер работы с ним (т. е. какая операция будет производиться: чтение из файла или запись в него).

Описания функций работы с файлами находятся в библиотеке stdio.h. Эта библиотека должна быть включена в текст программы соответствующей директивой:

#include <stdio.h>

После директивы в программе необходимо создать указатель на переменную типа FILE:

FILE *F;

Открытие файла производится вызовом функции fopen, имеющей следующий синтаксис:

FILE *fopen(const char *file_name, const char *mode);

В данной функции file_name – имя файла, который необходимо открыть; mode – аргумент, указывающий, в каком режиме должен быть открыт файл. В табл. 6.1 представлены спецификаторы аргумента mode.

54

 

Таблица 6.1

 

 

r

Открыть файл только для чтения

r+

Открыть файл для чтения и записи

a

Открыть или создать файл для записи данных в конец файла

a+

Открыть или создать файл для чтения или записи данных в конец файла

w

Создать файл для записи

w+

Создать файл для чтения и записи

К рассмотренным спецификаторам могут добавляться символы «t» – текстовый файл, «b» – бинарный файл. Например, открытие файла для записи может быть выполнено с использованием следующей команды:

F=fopen("Файл1.dat", "wb");

В данном случае открывается файл с именем Файл1.dat для записи информации в бинарном режиме. Если аргумент file_name не содержит путь к файлу, то поиск файла будет производиться в папке проекта. Если файл с именем Файл1.dat существует, он будет открыт для записи. В случае отсутствия указанного файла среда сначала создаст новый файл с именем Файл1.dat в папке проекта, а затем откроет его. Функция fopen возвращает указатель на файловую переменную.

Также необходимо отметить, что указание пути нахождения файла на диске в среде C++ Builder имеет следующую особенность. При указании папок на диске и имен файлов следует использовать обратный двойной слеш [1]. Например, для открытия файла с именем Файл1.dat, находящегося в папке E:\Doc\Project, необходимо выполнить команду

F=fopen("E:\\Doc\\Project\\Файл1.dat", "wb");

Для доступа к информации в двоичном файле применяются функции fread и fwrite. Они имеют следующий синтаксис [7]:

size_t fwrite(void *ptr, size_t size, size_t n, FILE *stream);

Здесь аргумент ptr – указатель на переменную, откуда будут записываться данные; size – размер одного блока записываемых данных; n – число таких блоков, записываемых за одно обращение к функции; stream – указатель на файловую переменную. Функция возвращает число фактически записанных блоков или 0 в случае ошибки.

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

Здесь аргумент ptr – указатель на переменную, в которую будут считываться данные; size – размер одного блока читаемых данных; n – число таких блоков, считываемых за одно обращение к функции; stream – указатель на фай-

55

ловую переменную. Функция возвращает число фактически прочитанных блоков или 0, если произошла ошибка (например, достигнут конец файла).

После завершения работы функций fread и fwrite файловый указатель смещается на число прочитанных или записанных байт. Таким образом, чтение и запись данных с помощью рассмотренных функций являются последовательными.

Для обеспечения доступа к любому месту файла следует использовать функцию fseek, имеющую следующий синтаксис [7]:

int fseek(FILE *stream, long offset, int fromwhere);

В данной функции stream – указатель на файловую переменную; offset – число байт, на которое нужно сдвинуть файловый указатель; fromwhere – это место, с которого нужно начинать сдвиг. Аргумент fromwhere может принимать следующие значения: SEEK_SET – начало файла; SEEK_CUR – текущее положение файлового указателя; SEEK_END – конец файла.

Запись данных в открытый ранее файл Файл1.dat может быть произведена командами:

int Number=46;

fwrite(&Number, sizeof(int), 1, F);

В данном случае в файл будет записано целое число 46. Количество байт, записанных в файл, будет равно размерности целого числа (тип int).

Чтение одного байта данных из файла Файл1.dat в переменную Ch_sym может быть выполнено командами:

char Ch_sym;

fread(&Ch_sym, sizeof(char), 1, F);

После завершения работы с файлом обязательно должна быть выполнена процедура закрытия файла. Закрытие файла осуществляется выполнением команды

F=fclose(F);

Файлы являются простым и удобным средством хранения информации на электронных носителях, поэтому задачи разработки программ для работы с файлами возникают достаточно часто.

Ход работы

1.Запустить программную среду C++ Builder 6, создать новый проект (тип проекта – Application) [1]. Примерный вид окна после создания нового проекта показан на рис. 6.1.

2.Cохранить проект на жестком диске ПК, используя пункт Save All меню

File (рис. 6.1).

56

Рис. 6.1

3. Разместить на форме один компонент Memo, два компонента Button, один компонент Edit [2]. Далее будем использовать следующие имена компонентов:

Memo1, Button1, Button2, Edit1.

4. Задать свойству Caption компонента Button1 значение «ЗАПИСАТЬ ФАЙЛ», задать свойству Caption компонента Button2 значение «СЧИТАТЬ ФАЙЛ» (примерный вид окна после размещения указанных компонентов показан на рис. 6.2).

Рис. 6.2

57

5. В тексте исполняемого файла Unit1.cpp разместить следующие директивы [7]:

#include <fstream.h>

#include <stdio.h>

6. В файле реализации формы разместить следующий программный код (в начале файла, вне программных блоков):

int NumberOfChar;

char Symb_1[50];

7. В обработчике события OnClick компонента Button1 разместить следующий программный код:

FILE *F;

strcpy(Symb_1, Edit1>Text.c_str()); NumberOfChar=Edit1>Text.Length();

if ((F=fopen("Файл1.dat", "wb"))==NULL)

{

ShowMessage ("Ошибка! Файл не удалось открыть."); return;

}

else

{

fwrite(&NumberOfChar, sizeof(int), 1, F); fwrite(Symb_1, sizeof(char), strlen(Symb_1)+1, F); ShowMessage ("Файл успешно записан!!!");

fclose(F);

}

8. В обработчике события OnClick компонента Button2 разместить следующий программный код:

FILE *F;

if ((F=fopen("Файл1.dat", "rb"))==NULL)

{

ShowMessage("Ошибка! Файл не удалось открыть."); return;

}

else

{

fread(&NumberOfChar, sizeof(int), 1, F); for (int ind =1; ind<NumberOfChar+1; ind++)

{

58

fread(&Symb_1[ind], sizeof(char), 1, F); Memo1>Lines>Add(Symb_1[ind]);

if (Symb_1[ind]=='\0') break;

}

fclose(F);

}

9. Откомпилировать и выполнить разработанное ПО. Проект считать успешно откомпилированным при отсутствии сообщений об ошибках в процессе компиляции. Примерный вид экранной формы показан на рис. 6.3.

Рис. 6.3

10.В поле компонента Edit1 написать текст, предназначенный для записи

вфайл (например, «Сохраненные данные»).

11.В окне Form1 нажать кнопку «ЗАПИСАТЬ ФАЙЛ». После выполнения данного действия на экран должно быть выведено окно с сообщением «Файл успешно записан!!!» (рис. 6.4). Данное сообщение свидетельствует об успеш-

ном создании бинарного файла с именем Файл1.dat на жестком диске компьютера (в папке проекта). При этом в файл был записан текст, введенный в поле компонента Edit1 в п. 10.

Рис. 6.4

59

12. В окне Form1 нажать кнопку «СЧИТАТЬ ФАЙЛ». После выполнения данного действия в поле компонента Memo1 должен быть выведен текст, записанный при выполнении п. 10 (рис. 6.5). Текст в поле компонента Memo1 должен совпадать с текстом, записанным при выполнении п. 10.

Рис. 6.5

Контрольные вопросы

1.В каких случаях в текст программы следует включатьтекст файла«stdio.h»?

2.Приведите пример записи функции fopen при необходимости указания пути к открываемому файлу.

3.Какие разделительные символы используются при записи текстового файла?

4.Что такое двоичные (бинарные) файлы?

5.Какая функция позволяет перемещать указатель данных в файле на определенную позицию?

6.Назовите и кратко опишите функции считывания данных из файла.

7.Назовите и кратко опишите функции записи данных в файл.

8.Какая функция выполняет чтение информации из текстового файла по строкам?

9.Какие преимущества имеют двоичные файлы перед текстовыми?

10.Назовите и кратко опишите способы работы с файлами в среде С++ Builder 6.

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]