Visual C++. Лабораторная работа № 5.
Работа с файлами в VC++. Использование файлов для хранения данных.
- Цель работы:
- Изучить приемы работы с файлами и способы создания файлов. Получить практические навыки по использованию
файлов для хранения информации.
1. Создайте приложение с помощью MFС AppWizard (exe), с диалоговым окном в
качестве главного. Использовать решенную в лабораторной работе № 4 задачу,
добавив в нее возможность записи внесенных в структуру данных в файл на диске
и возможность в последующем записать данные из файла в структуру
2. Усовершенствовать полученную в первом пункте программу, добавив
режим выбора файла в стандартном диалоге Windows
3. Усовершенствовать полученную программу добавив к кнопкам ОК и Cancel Программный
код напоминающий о возможности сохранения данных на диске
Пойдем тем же скользким путем, что и лабораторной работе № 4, т.е. выполним все
задания в одной программе. Для начала добавим в структуру еще два элемента:
int NumCars; //Количество автомобилей
char Cars[15]; //Название автомобилей
Т.к. в предыдущей работе мы не сохраняли названия автомобилей и их количество,
то в исходном файле везде переменную NumCars придется заменить на
car[0].NumCars (хранить количество автомобилей будем в нулевом элементе массива).
При нажатии на кнопку ДОБАВИТЬ нам придется добавлять в массив еще два элемента.
С количеством автомобилей проблем не было, а вот с названием не все так просто.
Делать это нужно с использованием стандартной функции копирования строки:
strcpy(car[NumCars].Cars, m_edAdd);
В теле функции OnInitDialog() уберем все лишнее (инициализацию массивов) и
добавим следующий код:
car[0].NumCars = 0; //На тот случай, если файлов не окажется
FILE *F; //Файловая переменная
if ((F = fopen("base.dat", "r")) == NULL) //Если файл не существует, то
AfxMessageBox("Файл 'base.dat' не найден!"); //выдать сообщение
else //иначе прочитать файл в массив car и вывести названия
{ //автомобилей в список
fread(&car, sizeof(car), 1, F);
fclose(F);
for (int i = 0; i < car[0].NumCars; i++)
m_lbGarage.AddString(car[i].Cars);
}
Добавляем кнопку ОТКРЫТЬ и прописываем для нее:
void CLab_04_1Dlg::OnOpen()
{
CFileDialog fd(TRUE,NULL,"*.dat",NULL,"(*.*)|*.*|(*.dat)|*.dat|");
int res = fd.DoModal();
if (res == IDOK) //Если пользователь выбрал ОТКРЫТЬ
{
for (int i = car[0].NumCars - 1; i >= 0 ; i--)
{
m_lbGarage.DeleteString(i); //Очистить списки
m_lbResult.DeleteString(i);
}
FILE *F;
if ((F = fopen(fd.GetPathName(), "r")) != NULL) //Прочитать файл
fread(&car, sizeof(car), 1, F); //и записать данные в массив
fclose(F);
for (i = 0; i < car[0].NumCars; i++) //Вывести данные в список
m_lbGarage.AddString(car[i].Cars);
}
}
Кнопки ОК и Cansel мы уже удалили. Думаю, ничего страшного не произойдет, если
задание из пункта 3 мы выполним в обработчике события, которое соответствует
нажатию на кнопку ЗАПОМНИТЬ. Добавим туда следующий код (к уже имеющемуся):
CFileDialog fd(FALSE,NULL,"*.dat",NULL,"(*.*)|*.*|(*.dat)|*.dat|");
int res = fd.DoModal();
if (res == IDOK)
{
FILE *F;
F = fopen(fd.GetPathName(), "w");
fwrite(&car, sizeof(car), 1, F);
fclose(F);
}
При создании объекта класса CFileDialog первый из передаваемых параметров устанавливает тип диалога.
Если он имеет значение TRUE, то открывается окно для открытия файла, иначе - для
сохранения.
Ну вот и все…