
- •Уточнение задания по тп v2.0
- •Пояснение задания
- •Некоторые моменты
- •Описание подпрограмм
- •Создать файловую систему с заданными параметрами (форматировать диск)
- •Удалить файл
- •Переименовать файл
- •Добавить информацию в существующий файл
- •Изменение типа файла
- •Сжатие файловой системы
- •Записать метку тома и владельца
Некоторые моменты
Подпрограммы нужно реализовать в виде методов данного класса FS.
Наш руководитель (да продлятся его годы) требует, чтобы в процессе работы подпрограмм перехватывались всевозможные ошибки. Ошибки, которые можно предвидеть- отсутствие файла с заданным именем в ФС, недостаток памяти и т.д. могут быть обработаны штатно- подпрограмма обнаруживает наличие такой исключительной ситуации и возвращает соответствующий код ошибки. Остальные ошибки, которые могут возникнуть в подпрограмме из-за невнимательности и кривых рук (деление на ноль, выход за пределы массива и т.д.) могут быть перехвачены с помощью блоков try{}, catch{}. Вот пример:
#include <iostream>
using namespace std;
void main()
{
try
{
int i = 10;
int j = 0;
int k = i/j; //Error on this line.
}
catch(...)
{
cout<<"aaaaaaa";
}
cin.get();
}
Т.е. весь текст подпрограммы можно заключить в блок try, а в блоке catch написать
return 1;(код ошибки).
В некоторых подпрограммах требуется выводить на экран сообщение(оглавление, информацию о свободном пространстве). Напрямую пользоваться cin нельзя. В подпрограмму в качестве параметра будет передаваться адрес переменной &screen типа stringstream, выводить информацию нужно будет в неё:
screen<<"xyz";
Описание подпрограмм
Описание подпрограмм практически не изменилось(разве что не нужно забивать единичками занятые области на диске). Изменились списки параметров и возвращаемые коды.
Создать файловую систему с заданными параметрами (форматировать диск)
Процедура получает следующие аргументы:
Размер системы(в блоках)
Метка тома
Владелец
Процедура должна создать объект класса FSфайл, в системном блоке записать метку тома, владельца, версию системы(1.0?), название системы, разметить нужное количество сегментов каталога- записать в них содержимое заголовков, в первом сегменте добавить запись о всем свободном пространстве и признак конца записей, в остальных сегментах- признаки конца записей.
Размер сегмента-1024 байта, размер записи о файле- 16 байт, учитывая, что в сегменте есть заголовок, получим что сегмент описывает 62файла(1 запись-признак конца записей в сегменте). Файл занимает, как минимум, 1 блок, значит количество сегментов в каталоге- это (количество свободных блоков в системе)\62+1.
Процедура должна вернуть код завершения:
0-успешное завершение
1-непредвиденная ошибка
Вывести оглавление как оно есть
Получаемый параметр- адрес указателя на переменную – буфер информации.
Процедура должна пройти по каталогу (по всем задействованным сегментам), просмотреть все записи до признака конца записей и вывести в поток названия, типы и размер всех файлов.
Процедура должна вернуть код завершения:
0-успешное завершение
1-непредвиденная ошибка
Вывести оглавление в алфавитном порядке
То же, что и в предыдущей процедуре, только файлы сортируются по имени в алфавитном порядке.
Вывести информацию о пустом месте на диске и его характеристиках
То же самое, что и выше, только нужно найти в каталоге записи о пустых областях и вывести в поток их общее количество и размеры каждой.
Создать файл
Процедура получает следующие параметры:
Имя файла
Тип файла
Размер
Процедура должна пройти по каталогу файлов и найти запись о свободной области с размером больше либо равным размеру записываемого файла. На её место добавляется запись о созданном файле, все последующие записи сдвигаются на одну позицию вниз и на освободившееся место (после созданной записи о файле) добавляется запись о свободной области с размером, равным разнице размеров записанного файла и исходной свободной области. Если при сдвиге записей окажется, что сегмент заполнен записями(признак конца записей попал на 63-ю позицию), то нужно перейти на следующий сегмент, при этом в заголовках всех сегментов нужно увеличить счетчик задействованных сегментов. Может сложиться ситуация, что все имеющиеся сегменты полностью заполнены записями. В этом случае процедура должна вернуть код ошибки. Также может оказаться, что в системе недостаточно памяти для записи файла, при этом тоже должен возвращаться код ошибки.
Перед записью файла неплохо было бы пробежаться по всему каталогу и проверить, что файла с таким именем и типом не существует.
Процедура возвращает следующие коды:
0-успешное завершение
1-непредвиденная ошибка
2-недостаточно места в системе
3-недостаточно места в каталоге
4-такой файл уже существует