Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Редактирование данных: функция chcd()

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

Прежде всего, функция chcd() запрашивает название компакт-диска, в который вы хотите внести измене- ния, затем выполняет цикл while, в котором считывается каждая структура:

openrw();

puts("Введите название диска: "); gets(chname);

while (fread(&disc, sizeof(disc), 1, fp) == 1)

{

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

if (strcmp(disc.name, chname) != 0) fwrite(&disc, sizeof(disc), 1, tp);

Когда функция встречает искомую запись, она выводит на дисплей текущие данные, а затем дает под- сказку для ввода новой информации:

else

{

fflag = 'y';

puts("Текущие данные\n"); showdisc(); puts("Новые данные\n");

printf("Введите название диска: "); gets(disc.name); printf("Введите описание: "); gets(disc.description); printf("Введите категорию: ");

gets(disc.category); printf("Введите цену: "); scanf("%f", &disc.cost); if (count >= MAX)

{

puts("Невозможно ввести номер ячейки\n"); pause = getchar();

}

else

{

getslot();

}

Инструкция if (count >= MAX) не позволяет пользователю ввести новый номер ячейки, если файл содер- жит максимально допустимое количество записей. В этом случае функция getslot() не выполнится и ис- ходный номер ячейки будет прочитан с диска и занесен в конец отредактированной записи.

Функция chcd() написана таким образом, что пользователь вынужден набирать всю информацию о диске заново, даже если он хочет изменить всего один пункт. Вы можете самостоятельно сделать редактирова- ние информации более удобным для пользователя, если измените ее так, чтобы он мог ограничиться про- стым нажатием клавиши Enter в том случае, если необходимо сохранить текущее содержимое какого- нибудь пункта. Например, для ввода нового названия можно использовать следующие инструкции:

Printf("Введите название диска: "); gets(disc.Name);

if (strlen(name) > 0)

strcpy(disc.name, name);

Если пользователь вводит новое название, оно присваивается переменной disc.name, после чего заносит- ся в файл вместе с соответствующей записью. Если пользователь нажимает Enter, не печатая нового на- звания, содержимое disc.name остается без изменений и в записи сохраняется прежнее наименование диска.

Поскольку нам необходимо выводить информацию на экран несколько раз во время работы программы, процедуру вывода можно выделить в самостоятельную функцию, названную нами showdisc(), и вызывать ее по мере надобности:

showdisc()

{

printf("Название %s\n", disc.name); printf("Описание %s\n", disc.description); printf("Категория %s\n", disc.category); printf("Цена %6.2f\n", disc.cost); printf("Номер п/п %d\n", disc.number); puts("\n\n");

return;

}

После чтения новых данных функция chcd() записывает структуру во временный файл:

fwrite(&disc, sizeof(disc), 1, tp);

После завершения чтения файла fp функция chcd() закрывает оба файла. Если ни одна запись не была отредактирована (например, потому что не был найден указанный диск), функция выводит на экран соот- ветствующее сообщение и останавливается:

fclose(fp); fclose(tp);

if (fflag == 'n') nofind();

Если изменения были внесены, функция chcd() снова открывает файлы с обратным порядком доступа, пе- реписывает данные в исходный файл данных и обновляет массив номеров ячеек:

else

return;

}

{

openwr();

while (fread(&disc, sizeof(disc), 1, tp) == 1) fwrite(&disc, sizeof(disc), 1, fp);

fclose(fp); fclose(tp);

}

getslots();

Изменение номера ячейки: функция chloc()

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

puts("Текущая информация\n"); showdisc();

puts("\nНовый номер\n"); getslot();

Однако в начало функции добавлена инструкция if, чтобы избежать изменения номера ячейки в том слу- чае, если в контейнере нет свободных ячеек.