Форум программистов, компьютерный форум CyberForum.ru

Создать модель файловой системы на основе связанных списков - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Записать програму с функцией http://www.cyberforum.ru/cpp-beginners/thread371966.html
Которая решает уравнение второго степени.Помогите пожалуйста,так как я даже не знаю с чего начать.Дело в том,что вообще не понимаю эти функции и ретёрны.. Знаю точно,что там должно быть 4 части: 1. input 2. 2 solve 3.output 4. честно говоря,даже не знаю,какая эта часть. Просьба не использовать printf,while или что-то наподобие этого,так как этого не учили ещё:) Спасибо! Добавлено через...
C++ Программа на определение числа Добрго дня или ночи, помогите составить код программы, уже 5 день пошёл, ничего путного в голову не лезет? Последовательность т.н. треугольных чисел определяется следующим образом: первый член последовательности равен 1, второй на 2 больше первого, третий на 3 больше второго и т. д. Т.е. треугольными являются числа 1, 3, 6, 10, 15, ... . Пользователь вводит число, определить является ли оно... http://www.cyberforum.ru/cpp-beginners/thread371965.html
C++ Перегрузка оператора +
Всем добрый вечер. Прошу помочь разобраться. Задание - Для определения даты поставки строительных материалов необходимо перегрузить операцию вычисления даты через определенное количество дней. Для этого перегрузите операции «дата» + «int», «int» + «дата» (две последние операции различны, перестановка операторов транслятором не производится). #include<iostream> #include<conio.h> using...
C++ Перегрузка оператора инкремента/декремента через friend
Нужно реализовать перегрузку унарного оператора через friend. Что я пытаюсь сделать: friend void operator -- ();//prototype void operator --() { cout << "Overloaded operator --"<< endl; //bla-bla-bla } Не суть, что в коде, потому что парсер даже до него не доходит, пишет, что слишком мало параметров для функции оператор. Why?
C++ Паттерн Domain Model (Модель области определения) http://www.cyberforum.ru/cpp-beginners/thread371950.html
Кто что может подкинуть по этому Паттерну?))
C++ Выводит вместо массива е числа от балды. Где проблема? Пишу программу, попутно сталкиваюсь с проблемами, которые непонятны, ибо что-то подзабыл и не получается никак понять. #include <stdio.h> #include <conio.h> #include <math.h> int main() { FILE *in;//ôàéë èñõîäíûõ äïííûõ FILE *out;// ôàéë íà çàïèñü FILE *t;//òåñòîâûé подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
26.10.2011, 22:45     Создать модель файловой системы на основе связанных списков
Ну, короче как бы сделал я. Раз надо сязный список, то представим виртуальный диск VD и допустим в нём папка X а в ней несколько папок papka_1 papka_2 papka_3 и два файла fail_1 fail_2

Тогда содержание папки VD\X и есть тот самый двусвязный список
papka_1-> papka_2-> papka_3-> fail_1-> fail_2

Сделать его легко и добавлять туда элементы очень легко. Сам бы я список не стал реализовывать, а взял готовый шаблон из библиотеки STL. Там по-моему несколько функций надо пустяковых написать (чуть ли не одну-две). Функцию сравнения. Это так: каждый элемент это элемент типа FDat. Но, как правильно было замечено, тут нет индикатора того, папка это или файл. Поэтому введём туда новое поле
C++
1
2
3
4
5
6
7
8
9
struct FDat {               //структура данных
 char Name[20];          //имя
 char r[4];              // расширение
 char d[10];             //       дата 
 int size;               // размер
 bool papka_ili_fail;    //новое поле
 char attr[4];           //  атрибут
 FDat *Next;
 };
И условимся что true это папка, false это файл. ПИшешь функцию сравнения, сравниваешь
по полю papka_ili_fail
Всё, создаёшь новый элемент и спокойно вставляешь в список и он вставляется.
Обрати внимание, впереди будут папки, позади файлы. Но папки вперемежку друг
с другом и файлы тоже. Если хочешь упорядочит их по алфавиту, надо будет сортировать
не только по полю papka_ili_fail, но и по имени. Но это детали.

С содержанием отдельно взятой папки мы разобрались.
Но каждая папка как бы содержит в себе другие файлы и папки. То есть надо в переменной
FDat создать указатель на "внутренее содержание". Причём, если это папка, то пусть
он куда-то реально указывает, а если файл- то никуда (файл не может в себе содержать
другие файлы)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct FDat {               //структура данных
 char Name[20];          //имя
 char r[4];              // расширение
 char d[10];             //       дата 
 int size;               // размер
 bool papka_ili_fail;
 char attr[4];           //  атрибут
 
 //Вот этот новый указатель. 
 FDat *ukazatel
 
 FDat *Next;
 };
ТОгда если в папке papka_2 есть papka_0 и fail_34, то получаем такой список:
papka_2-> papka_0-> fail_34

Причём обрати внимание
papka_0 и fail_34 лежат в папке papka_2

Ну вот так примерно. Ещё: поскольку бывают пустые папки, то тогда тоже надо подумать,
куда пусть указывают их указатели. Но это детали реализации уже.

И ещё: каждый файл в этом виртуальном диске будет иметь какое-то настоящее имя
C:\бля-бля-бля\рабочий стол\проект\виртуальный_диск И ВСЁ В ТАКОМ ДуХЕ
Вот наверное надо в структуре FDat предусмотреть string, содержащий РЕАЛЬНОЕ ИМЯ ФАЙЛА

Задание интересное, сам бы взялся, да некогда. Блин, если это такие курсовые, это вселяет
в меня слабую наждежду на меня.


Добавлено через 16 часов 39 минут
Теперь: решил поправить твой код, но по-моему там много ошибок. НАчасть с первой. Итак, пошли на добавление записи:
C++
1
2
3
4
   if (Begin == NULL) {
    Begin = Add(Posl);
    Posl = Begin;
   }
это понятно, то есть если нет ни одного файла или папки, делаем то-то и то-то.
Как я тебя убедил, надеюсь, виртуальный диск это всего-навсего файл с кучей таких вот переменных типа FDat. Вот мы насоздавали таких переменых в этом файли и вышли. Из программы

А потом снова решили чё-то добавить в этот виртуальный диск. Запускаем программу и получается херь. С одной стороны, нам надо задействоват файл-вртуальный диск, дабы кудато пихать новую запись, с другой- Begin снова равна 0, то есть вроде как диск пуст.

Нет так не пойдёт. Позаботься о создании файла "виртуальный диск", чтобы каждый раз прога считывала оттуда даные и решала, пуст диск или нет, ориентируясь на этотфайл, а не на Begin, которая будет всякий раз при входе в прогу, показывать, что диск пуст.

Добавлено через 2 часа 36 минут
Теперь такое соображение
Представим себе работу с виртуальным диском.
В оперативной памяти у нас есть куча переменых типа FDat, разбросанных по памяти и незримо связанных меж собой. Как мы договорились, всё это благолепие благополучно сохраняется в файле VD при закрытии программы.

Чем связаны меж собой эти переменные находясь в оперативной памяти? Адресами. То есть по этим связям мы их находим. И эти адреса сохраняются в файле VD. По новому запуску программы вся эта херь снова проецируется в память и всё круто, адреса сохранены, связи восстановлены.
Круто, да не совсем. Ибо, хе-хе, кмпилятор поместит всю эту херь туда, куда поместит, совсем ПО ДРУГИМ АДРЕСАМ, нежели сохранённые. И все наши связи насмарку. Допустим, адрес который в какой-нибудь папке X находится, указывает на другую папку Y. И он равен cafebabe. А в следующий раз ось помещает папку Y (не папку, конечно, но соответствующую ей запись по адресу babecafe).
Чё делать?
Я вижу два пути
1) Каждая переменная пусть имеет плюсом два дополнительных поля- свой уникальный идентификатор и уникальный идентификатор то переменной, на которую она указывает.
Тупо пронумеровать их и получится, что переменная 1 указывает на переменную 4, та указывает напеременную 6, та указывает на переменную 8. Эти номера сохраняются в файле VD, а при новом запуске программы все адеса восстанавливаются по этим вот данным и по одному единственному адресу который нам действительно необходимо знать: по адресу начала каталога.
...Кстати, каждый файл и так будет иметь уникальный дентификатор- собственное реальное имя на диске С. Этим можно воспользоваться, но тогда каждая переменная будет слишком большой- вместо номера своей "соседки" на этом месте будет её реально имя. Так, если папка 2 указывает на папку с номеро 6, то вместо номера 6 будет имя. Это не наш метод

2) второй способ основан на том, что данный из файла VD можно проецровать в непрерывную область памяти.
Допустим, мы работаем с нашим диском и переменные находятся по адресам 10, 14, 18, 22 и так далее (через 4 байт, или через сколько там, важно, что через равное количество байтов)
Запоминаем адрес родительского каталога 10
закрываем-окрываем программу

Видим, что корневой каталог лежит по адресу 23! Как мы найдё адреса осальных? Правильно, 25, 26 и 28. Распихиваем эти данные по нужным полям и можно работать с диском.

Чем мне не нравится такой способ- при добавлении записи её придётся добавлять в конец массива переменных типа DFat. И всё бы ничего, но если там не окажется места? А тогда придётся работать с alloc функциями. Можно, но мне этот способ не нравится.

Добавлено через 1 минуту
Ой, вру 27, 31 и 35
 
Текущее время: 03:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru