Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование malloc(), free() с файлами 
V
    Опции темы
Белоснежка
  Дата 13.7.2013, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Язык: Си

Привет!

Я новичок. Задание:

Создать виртуальную систему со след. возможностями:

1. create - создаёт виртуальную файловую систему с тем-то именем, такого-то размера (тестировать будут с очень большими). Создаётся в виде двух файлов. Один из файлов (а) имеет заданный размер, в него потом копируются внутренности файлов хостовой системы, во второй файл (б) копируются данные файлов находящихся в вирт. сист.. Файл б не имеет определённого размера
2. add - копирует внутренности файла на хостовой системе в файл а, а его размер, название и т.д. и т.п. в файл б.
3. удаление файлов
4. дефрагментация системы
5. возможность посчитать количество свободного 
6. или занятого места


Вот. Теперь мой вопрос: для чего в этом проекте нужен malloc(), free()? Их нужно обязательно использовать.. Но я не могу себе это представить с файлами. Для чего резервировать место? Это как-то связано с функцией add? Что делать? :( Теоретически create у меня работает... Получается даже создать файл с размеров в терабайт (КАК?! не понимаю). Но что-то тут не так... :( Помогите мне пожалуйста! Если что-то не понятно, я попробую перефразировать.. :(


Вот то, что я пока написала:

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[]){

if(strcmp(argv[1],"create")==0){
char store[64];
char structure[64];
snprintf(store, 64, "%s.store", argv[2]);
FILE *datei1;
datei1 = fopen(store,"w");
snprintf(structure, 64, "%s.struture", argv[2]);
FILE *datei2;
datei2 = fopen(structure,"w");
}

if else (strcmp(argv[1],"add")==0){

}

if else (strcmp(argv[1],"remove")==0){

}

if else (strcmp(argv[1],"defrag")==0){

}

if else (strcmp(argv[1],"used")==0){

}

if else (strcmp(argv[1],"free")==0){

}

}


Ах да, можно ли сделать свитч тут? Как это сделать с char?

Это сообщение отредактировал(а) Белоснежка - 13.7.2013, 00:59
PM MAIL Skype   Вверх
feodorv
Дата 13.7.2013, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Белоснежка @  13.7.2013,  01:56 Найти цитируемый пост)
Создать виртуальную систему со след. возможностями

Что-то мне подсказывает, что всё это на FAT сильно смахивает... Только имя файла может быть длинным...


Цитата(Белоснежка @  13.7.2013,  01:56 Найти цитируемый пост)
для чего в этом проекте нужен malloc(), free()

Например, при дефрагментации пригодится.


Цитата(Белоснежка @  13.7.2013,  01:56 Найти цитируемый пост)
Теоретически create у меня работает..

Из приведённого кода этого не видно  smile 


Цитата(Белоснежка @  13.7.2013,  01:56 Найти цитируемый пост)
Ах да, можно ли сделать свитч тут? Как это сделать с char?

С char * не получится. Можно действовать по-разному, например, так:
Код

int fsCreate( int argc, char* argv[]);
int fsAdd( int argc, char* argv[]);
int fsRemove( int argc, char* argv[]);
int fsDefrag( int argc, char* argv[]);
int fsUsed( int argc, char* argv[]);
int fsFree( int argc, char* argv[]);

typedef int (*action)( int argc, char* argv[]);

struct task
{
  const char *name;
  action action;
};

const struct task taskTable[] =
{
  { "create", fsCreate },
  { "add", fsAdd },
  { "remove", fsRemove },
  { "defrag", fsDefrag },
  { "used", fsUsed },
  { "free", fsFree },
  { NULL }
};

const struct task *getTask( const char *name )
{
  const struct task *task;

  for( task = taskTable; task->name != NULL; task++)
    if( strcmp( name, task->name) == 0 ) return task;

  return NULL;
}

int main( int argc, char* argv[])
{
  const struct task *task;

  if( argc < 2 )
  {
    printf( "Usage: proga <task> ...\n" );
    return -1;
  }
  if( (task = getTask( argv[1] )) == NULL )
  {
    printf( "Unknown task\n" );
    return -1;
  }

  return task->action( argc, argv);
}

int fsCreate( int argc, char* argv[])
{
  if( argc < 3 )
  {
    printf( "Usage: proga create <name>\n" );
    return -1;
  }

  char store[64];
  char structure[64];

  snprintf( store, 64, "%s.store", argv[2]);
  FILE *datei1 = fopen(store,"w");
  snprintf( structure, 64, "%s.struture", argv[2]);
  FILE *datei2 = fopen(structure,"w");

  if( datei1 == NULL || datei2 == NULL )
  {
    printf( "Karaul...\n" );
    return 1;
  }
 
  /* XXX: do work here */

  return 0;
}


Это сообщение отредактировал(а) feodorv - 13.7.2013, 01:59


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Белоснежка
Дата 15.7.2013, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата(feodorv @ 13.7.2013,  01:59)
Например, при дефрагментации пригодится.

Спасибо большое.. Дефрагментация.. Окей.. А можно спросить ещё пару вещей? smile 

Вот тут:

Код

char store[64];

Почему 64? Я это откуда-то скопировала, но так и не поняла почему. :( 

И ещё: как резервировать место в самом файле? Вот даже возьмём пример с дефрагментацией.. Это как-то связано с указателем на файл? 
PM MAIL Skype   Вверх
feodorv
Дата 15.7.2013, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Белоснежка @  15.7.2013,  19:53 Найти цитируемый пост)
Почему 64?

Ну это какой-то компромисс: если, скажем, указать 256, то обычно большинство байт из этих 256 использоваться не будет (если, конечно, пользователь не мазохист и не задаст в качестве имени Вашей файловой системы строку из 200 символов; ну а 32 или 16 может оказаться маловато. В любом случае контроль переполнения стоИт - snprintf'у передаётся размер отведённого под имя буфера.


Цитата(Белоснежка @  15.7.2013,  19:53 Найти цитируемый пост)
И ещё: как резервировать место в самом файле? Вот даже возьмём пример с дефрагментацией.. Это как-то связано с указателем на файл?  

Честно говоря, задача, стоящая перед Вами, крайне непростая, и кто только додумался давать её новичку...
Какой именно указатель на файл Вы имеете в виду? Один из datei? Пользуйтесь функциями fseek, fteel, fwrite, fread, fstat, они помогут Вам зарезервировать нужное место в нужном файле...


У меня к Вам тоже есть вопрос. В задании упоминается 2 файла, но я так и не понял, какую смысловую нагрузку будет нести каждый из них. Есть 2 варианта:
1/ а - оглавление файловой системы; б - содержимое файлов файловой системы
2/ а - содержимое файлов файловой системы; б - оглавление файловой системы
В оглавлении файловой системы будут находиться атрибуты файлов (имя, размер, указатель на содержимое файла). Какой вариант верен? 
Перечитал ещё раз задание, вроде, второй...


Цитата(Белоснежка @  15.7.2013,  19:53 Найти цитируемый пост)
Спасибо большое.. Дефрагментация.. Окей..

Мне тут подумалось, что при каждой операции с файловой системой придётся читать оглавление в память, а посему malloc(), free() ещё очень даже пригодятся...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Белоснежка
Дата 15.7.2013, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата(feodorv @ 15.7.2013,  20:22)
Цитата(Белоснежка @  15.7.2013,  19:53 Найти цитируемый пост)
Почему 64?

Ну это какой-то компромисс: если, скажем, указать 256, то обычно большинство байт из этих 256 использоваться не будет (если, конечно, пользователь не мазохист и не задаст в качестве имени Вашей файловой системы строку из 200 символов; ну а 32 или 16 может оказаться маловато. В любом случае контроль переполнения стоИт - snprintf'у передаётся размер отведённого под имя буфера.


Цитата(Белоснежка @  15.7.2013,  19:53 Найти цитируемый пост)
И ещё: как резервировать место в самом файле? Вот даже возьмём пример с дефрагментацией.. Это как-то связано с указателем на файл?  

Честно говоря, задача, стоящая перед Вами, крайне непростая, и кто только додумался давать её новичку...
Какой именно указатель на файл Вы имеете в виду? Один из datei? Пользуйтесь функциями fseek, fteel, fwrite, fread, fstat, они помогут Вам зарезервировать нужное место в нужном файле...


У меня к Вам тоже есть вопрос. В задании упоминается 2 файла, но я так и не понял, какую смысловую нагрузку будет нести каждый из них. Есть 2 варианта:
1/ а - оглавление файловой системы; б - содержимое файлов файловой системы
2/ а - содержимое файлов файловой системы; б - оглавление файловой системы
В оглавлении файловой системы будут находиться атрибуты файлов (имя, размер, указатель на содержимое файла). Какой вариант верен? 
Перечитал ещё раз задание, вроде, второй...


Цитата(Белоснежка @  15.7.2013,  19:53 Найти цитируемый пост)
Спасибо большое.. Дефрагментация.. Окей..

Мне тут подумалось, что при каждой операции с файловой системой придётся читать оглавление в память, а посему malloc(), free() ещё очень даже пригодятся...

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

А вообще да, сволочи они.. Вон в прошлом году дети писали игрушку (((

Это сообщение отредактировал(а) Белоснежка - 15.7.2013, 21:11
PM MAIL Skype   Вверх
fish9370
Дата 15.7.2013, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(Белоснежка @  15.7.2013,  21:10 Найти цитируемый пост)
Всё таки придётся взять 256, т.к. нам сказали, что данные и название могут быть оооочень большими


тут нужны динамические строки..

Добавлено через 5 минут и 6 секунд
Цитата(Белоснежка @  13.7.2013,  00:56 Найти цитируемый пост)
char store[64];


здесь лучше использовать именованную константу

Цитата(Белоснежка @  13.7.2013,  00:56 Найти цитируемый пост)
snprintf(store, 64, "%s.store", argv[2]);


здесь лучше использовать sizeof(store)


--------------------
undefined
PM MAIL WWW ICQ   Вверх
feodorv
Дата 16.7.2013, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(fish9370 @  15.7.2013,  22:30 Найти цитируемый пост)
тут нужны динамические строки..

Зачем?


Цитата(Белоснежка @  15.7.2013,  22:10 Найти цитируемый пост)
Вроде второй.. 

Ок. Давайте называть файл-а хранилищем, файл-б - оглавлением.

Тогда пора задуматься над архитектурой файловой системы. Я предлагаю самую-самую простую:
  • Файлы в хранилище будут непрерывными (то есть всё содержимое одним куском)
  • Записи в оглавлении будут идти последовательно (в согласии с последовательностью файлов в хранилище)
  • Записи в оглавлении будут фиксированной длины
  • Размер хранилища ограничен двумя гигабайтами (столько гарантировано позволяет FILE*), о терабайтах не мечтайте


Соответственно, при создании файловой системы нужно будет:
  • определить размер файловой системы (какой-нибудь константой)
  • зарезервировать место на диске под файловую систему (то есть хранилище должно быть соответствующего размера)

Сделать всё это можно по-разному, но раз Вас просят malloc/free, то давайте так:

Код

#define FS_SIZE       (4*1024*1024)

int fsCreate( int argc, char* argv[])
{
  int rv = 0;

  ... /* то, что было */

  char *mem = malloc( FS_SIZE );
  if( mem == NULL )
  {
    /* жалоба */;
    rv = -1;
  }
  else
  {
    memset( mem, 0, FS_SIZE);
    if( fwrite( mem, FS_SIZE, 1, datei1) != 1 )
    {
      /* другая жалоба */;
      rv = -1;
    }
    free( mem );
  }

  fclose( datei1 );
  fclose( datei2 );

  if( rv != 0 ) /* приберёмся за собой */
  {
    unlink( store );
    unlink( structure );
  }

  return rv;
}


Здесь размер хранилища определён как 4 мегабайта (пока хватит).

Ждём вашего кода (пока для create).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Белоснежка
Дата 26.7.2013, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата(feodorv @ 16.7.2013,  06:49)
Ждём вашего кода (пока для create).

Спасибо. Отпишусь очень скоро. После экзаменов.  smile  
PM MAIL Skype   Вверх
Белоснежка
Дата 8.8.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Короче,

я решила оставить структуру if, else if.. А так же уже придумала как я собираюсь сохранять данные. smile Кодом отчитываться не буду, а то вдруг меня будут прогугливать ) 
А так же я поняла для чего нужен мэллок.. Мне нужно создать динамичный массив. 

Спасибо всем за внимание и помощь smile
PM MAIL Skype   Вверх
bsa
Дата 9.8.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Белоснежка, а что плохого в том, что ты выложишь свой код?!? Это твой код. И пусть прогугливают на здоровье. Главное, что за тебя не писали. И ты сама принимала решения.
PM   Вверх
SenkraD
Дата 9.8.2013, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: нет
Всего: 23



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


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
bsa
Дата 9.8.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



можно серым шрифтом в конце сообщения написать "Привет проф. Иван Иванычу".  smile 
PM   Вверх
Белоснежка
Дата 9.8.2013, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Может быть и так, но рисковать не хочется. smile smile 

Другой вопрос.. Я тут вписала целый массив в файл. А можно его считать не как стринг, а как обычный код? То есть чтоб он заработал.  smile 
PM MAIL Skype   Вверх
bsa
Дата 9.8.2013, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



вопрос не совсем полный (хотелось бы знать как записала). но ответ "скорее всего да".
PM   Вверх
Белоснежка
Дата 9.8.2013, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата(bsa @ 9.8.2013,  19:33)
вопрос не совсем полный (хотелось бы знать как записала). но ответ "скорее всего да".

Код

char blockarray[blockcount][1];        //block array
        char filearray[0];
        char buffer[blockcount];
        int i;
        for (i = 0; i < blockcount; i++)
            {
            snprintf(buffer,blockcount,"%d",i);
            blockarray[i][0] = '0';        //0=files_count
            fputs("blockarray[",datei2);
            fputs(buffer,datei2);
            fputs("][0] = '0';",datei2);
            }
        

Вот так  smile 

Конечно можно записать только содержание массива, но он будет гигантский, многомерный, и его будет трудно при считывание содержания строить заного..

Это сообщение отредактировал(а) Белоснежка - 9.8.2013, 19:39
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.