| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > использование malloc(), free() с файлами |
| Автор: Белоснежка 13.7.2013, 00:56 | ||
| Язык: Си Привет! Я новичок. Задание: Создать виртуальную систему со след. возможностями: 1. create - создаёт виртуальную файловую систему с тем-то именем, такого-то размера (тестировать будут с очень большими). Создаётся в виде двух файлов. Один из файлов (а) имеет заданный размер, в него потом копируются внутренности файлов хостовой системы, во второй файл (б) копируются данные файлов находящихся в вирт. сист.. Файл б не имеет определённого размера 2. add - копирует внутренности файла на хостовой системе в файл а, а его размер, название и т.д. и т.п. в файл б. 3. удаление файлов 4. дефрагментация системы 5. возможность посчитать количество свободного 6. или занятого места Вот. Теперь мой вопрос: для чего в этом проекте нужен malloc(), free()? Их нужно обязательно использовать.. Но я не могу себе это представить с файлами. Для чего резервировать место? Это как-то связано с функцией add? Что делать? :( Теоретически create у меня работает... Получается даже создать файл с размеров в терабайт (КАК?! не понимаю). Но что-то тут не так... :( Помогите мне пожалуйста! Если что-то не понятно, я попробую перефразировать.. :( Вот то, что я пока написала:
Ах да, можно ли сделать свитч тут? Как это сделать с char? |
| Автор: feodorv 13.7.2013, 01:59 | ||
Что-то мне подсказывает, что всё это на FAT сильно смахивает... Только имя файла может быть длинным... Например, при дефрагментации пригодится. Из приведённого кода этого не видно С char * не получится. Можно действовать по-разному, например, так:
|
| Автор: Белоснежка 15.7.2013, 18:53 | ||||
Спасибо большое.. Дефрагментация.. Окей.. А можно спросить ещё пару вещей? Вот тут:
Почему 64? Я это откуда-то скопировала, но так и не поняла почему. :( И ещё: как резервировать место в самом файле? Вот даже возьмём пример с дефрагментацией.. Это как-то связано с указателем на файл? |
| Автор: Белоснежка 15.7.2013, 21:10 | ||||
Вроде второй.. Ну файл с расширением "store" должен содержать содержимое файлов, а другой всё остальное.. В задание написано, что нужно использовать мэллок и фри для динамичного использования памяти.. Всё таки придётся взять 256, т.к. нам сказали, что данные и название могут быть оооочень большими. Переменные для вычисления размера файла ".store" должны уметь принимать максимально возможное значение.. А вообще да, сволочи они.. Вон в прошлом году дети писали игрушку ((( |
| Автор: fish9370 15.7.2013, 21:30 | ||
тут нужны динамические строки.. Добавлено через 5 минут и 6 секунд здесь лучше использовать именованную константу здесь лучше использовать sizeof(store) |
| Автор: feodorv 16.7.2013, 06:49 | ||
Зачем? Ок. Давайте называть файл-а хранилищем, файл-б - оглавлением. Тогда пора задуматься над архитектурой файловой системы. Я предлагаю самую-самую простую:
Соответственно, при создании файловой системы нужно будет:
Сделать всё это можно по-разному, но раз Вас просят malloc/free, то давайте так:
Здесь размер хранилища определён как 4 мегабайта (пока хватит). Ждём вашего кода (пока для create). |
| Автор: Белоснежка 26.7.2013, 21:21 | ||
Спасибо. Отпишусь очень скоро. После экзаменов. |
| Автор: Белоснежка 8.8.2013, 21:25 |
| Короче, я решила оставить структуру if, else if.. А так же уже придумала как я собираюсь сохранять данные. А так же я поняла для чего нужен мэллок.. Мне нужно создать динамичный массив. Спасибо всем за внимание и помощь |
| Автор: bsa 9.8.2013, 11:52 |
| Белоснежка, а что плохого в том, что ты выложишь свой код?!? Это твой код. И пусть прогугливают на здоровье. Главное, что за тебя не писали. И ты сама принимала решения. |
| Автор: SenkraD 9.8.2013, 13:34 |
| я помню у друга был препод, который если находил в гугле фрагменты проги, то орал что она слизана и задание не засчитуется, так что может там такая же ситуация, хотя если уже поставили оценку и приняли задание, то смело можете выкладывать. |
| Автор: bsa 9.8.2013, 14:13 |
| можно серым шрифтом в конце сообщения написать "Привет проф. Иван Иванычу". |
| Автор: Белоснежка 9.8.2013, 19:04 |
| Может быть и так, но рисковать не хочется. Другой вопрос.. Я тут вписала целый массив в файл. А можно его считать не как стринг, а как обычный код? То есть чтоб он заработал. |
| Автор: bsa 9.8.2013, 19:33 |
| вопрос не совсем полный (хотелось бы знать как записала). но ответ "скорее всего да". |
| Автор: Белоснежка 9.8.2013, 19:37 | ||||
Вот так Конечно можно записать только содержание массива, но он будет гигантский, многомерный, и его будет трудно при считывание содержания строить заного.. |
| Автор: feodorv 9.8.2013, 22:41 |
| Боюсь, для этого понадобится встроенный интерпретатор языка C Белоснежка, объясните, пожалуйста, смысл происходящего... |
| Автор: akizelokro 12.8.2013, 21:21 |
| Не нужен встроенный интерпретатор. |
| Автор: feodorv 12.8.2013, 22:08 |
А что нужно? Белоснежка не хочет записывать данные в файл, а хочет всё записать в виде текста программы на C. И чтобы сразу это всё выполнить можно было |
| Автор: Белоснежка 13.8.2013, 01:21 | ||
Ага.. Но это невозможно.. :( Вот теперь нужно думать.. Как запихнуть факты в файл.. Сначала ведь все блоки пусты, а если в блок что-то добавляется, нужно написать с какого по какое место в блоке, название файла и ещё кучу ненужного дерьма, чтоб потом ещё и дефрагментацию сделать :(((( А в блок могут ещё и несколько файлов поместиться.. И как это всё записывать в файл? И вообще, можно прыгать на определённую строку в файле? По номеру? Эх.. Запить что ли.. |
| Автор: akizelokro 13.8.2013, 01:51 | ||
| Да ну вас.. привыкли с оболочками работать. кто мешает сделать формовку, на лету сгенерить файл, тут же вызвать компилятор, компильнуть, проверит наличие эхе-шника и запустить. а можно под это дело и makefile соорудить. Да и вообще на елансе для тестовых задач есть такие приблуды, вводишь текст проги, она либо компиляет (тест пройден), либо ругается на ошибку.но я там походу с эскейп-последовательностями никак не разберусь, 100% нормальные тексты прог мне выдаёт в ответах как ошибочные. Добавлено через 13 минут и 17 секунд метки вроде ещё никто не отменял. правда, плохой стиль, говорят.
|
| Автор: feodorv 13.8.2013, 04:56 | ||
Не работайте с текстовым файлом. Работайте с бинарным. Разработайте формат записи оглавления для хранимого файла (фиксированного размера). Например:
Пишите и читайте из файла-оглавления сразу всем массивом структур. Размер файла узнаётся функциями stat/fstat+fileno, запись и чтение блоков памяти - функциями fread/fwrite, перемещение по файлу - функцией fseek, позиция текущего указателя - ftell. Тогда число записей в файле-оглавлении определяется через (размер_файла-оглавления / sizeof(struct file_entry)), позиционирование указателя на запись номер N как fseek( f, N*sizeof(struct file_entry), SEEK_SET). Но я всё-таки предлагаю Вам каждый раз целиком в память читать содержимое файла-оглавления (вот и пригодятся malloc/free), в памяти с ним же и работать (добавить/удалить файл, дефрагментировать), затем целиком записать обратно (то есть полностью переписать файл-оглавление). Всё до безобразия просто, если отойти от строчной структуры))) |
| Автор: Белоснежка 20.8.2013, 15:43 | ||
Вот в этом месте у меня вопрос: А что если файл-оглавление будет оооочень большим? Понимаете, задание обязует использовать оооочень большие числа/большое количество знаков.. И вообще меня всё достало :( Другой вопрос: я когда создаю файл-содержимое, я создаю его определённого размера.. Но если в этот файл что-то записать, то его размер растёт... А мне нужен фиксированный. :( Как это сделать? |
| Автор: bsa 20.8.2013, 15:49 |
| Белоснежка, а кто тебе мешает пользоваться lseek/fseek для смены позиции в файле? Установи позицию на середину и пиши. Только имей в виду, что в этом случае ты затрешь старую информацию. И с текстовыми файлами этот метод работает очень плохо (или надо делать фиксированную ширину строки, или использовать бинарный). |
| Автор: Белоснежка 20.8.2013, 16:58 | ||
А как сделать бинарный? Линуксовский компилятор игнорит букву "б" при открытие файла.. Любая функция записи в файл переписывает содержимое? А можно "удалить" запись неизвестной длины? Вот скажем я хочу удалить строчку номер 6367. Это реально без полной переписи файла? Нам сказали, что из файла-оглавления минимум 2 блока поместятся в main memory. |
| Автор: feodorv 20.8.2013, 16:59 | ||||||||||
Ну, если хранить в хранилище огромную кучу файлов длинной по 1 байту, то да, размер оглавления станет оооочень большим)))) Но это всё лирика. У Вас на один файл в оглавлении уходит 300 байт. Если даже запихнуть в хранилище 100.000 файлов, то размер оглавления составит 30мег, вполне терпимая цифра. Более того, всегда от прямого чтения в память можно перейти к более изощрённым методам работы с оглавлением (mmap, переменный размер записи в оглавлении, просто указатели на записи в оглавлении и т.д.), но это можно будет сделать потом. Сейчас нужно наладить схему. И схема такова, что работать нужно с бинарным форматом, не строковым.
Числа чего? Знаки чего? Каков порядок чисел (что значит "оооочень большие")? Ну так надо философски смотреть на вещи. Программирование требует выдержки, и даже ленности в некоторых вопросах)))) А вот меня, например, достаёт Ваше нежелание поделиться кодом, приходится всё додумывать, и не поймёшь ещё при этом, правильно или нет...
Вопрос не понял. Судя по всему, Вы записываете в конец файла. Тогда да, размер будет расти. Если же писать внутри файла, не выходя за его границы, то и размер хранилища никак не может увеличиваться... Ответ был дан, и неоднократно:
После того, как файл-хранилище был создан (не более 2 гигабайт, иначе придётся менять способ доступа к нему), он открывается на чтение-запись "r+", чтобы в него что-то записать. Текущая позиция в файле при этом - ноль. Она меняется посредством вызова fseek. Но если файл отрывается на "append" - "a+", то любая запись будет осуществлена в конец файла, при этом его размер увеличится. Вопрос: как Вы открываете файл-хранилище? Добавлено через 9 минут и 18 секунд В Линуксе/Юниксах это без разницы, любой файл - бинарный. Просто структура у него не строковая, а иная. В бинарном файле могут встречаться "непечатные" символы, даже символ '\0'. Если не писать в конец файла, то да.
Так не выйдет, если хочется высвободить то место, которое ранее занимала строчка. Но опять-таки, откуда такая любовь к строчкам?
Опять не понятно. Почему "минимум", почему "два", что такое "блок"... |
| Автор: bsa 21.8.2013, 11:27 | ||
|
| Автор: Белоснежка 5.10.2013, 23:33 |
| Извините, вопрос исчерпан.. Неожиданным образом.,.. |
| Автор: bsa 10.10.2013, 11:45 |
| Белоснежка, расскажешь каким? |
| Автор: Белоснежка 11.10.2013, 01:54 |
| Я практически полностью переписала код. Не использовала мэллок, только кэллок.. И вообще всё вдруг пошло как по маслу... Были мелкие проблемы из-за невнимательности. В общем всем спасибо.. Мне видимо нужно было один раз написать о своей проблеме и я сразу находила решение )) Всё готово, всё прошло. Спасибо. |
| Автор: bsa 11.10.2013, 11:52 | ||
|