Модераторы: 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   Вверх
feodorv
Дата 9.8.2013, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Боюсь, для этого понадобится встроенный интерпретатор языка C smile 

Белоснежка, объясните, пожалуйста, смысл происходящего...

Это сообщение отредактировал(а) feodorv - 9.8.2013, 22:48


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


Крокодил
**


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

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



Не нужен встроенный интерпретатор. 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 12.8.2013, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(akizelokro @  12.8.2013,  22:21 Найти цитируемый пост)
Не нужен встроенный интерпретатор.  

А что нужно?  smile 

Белоснежка не хочет записывать данные в файл, а хочет всё записать в виде текста программы на C. И чтобы сразу это всё выполнить можно было  smile 


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


Новичок



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

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



Цитата(feodorv @ 12.8.2013,  22:08)
Цитата(akizelokro @  12.8.2013,  22:21 Найти цитируемый пост)
Не нужен встроенный интерпретатор.  

А что нужно?  smile 

Белоснежка не хочет записывать данные в файл, а хочет всё записать в виде текста программы на C. И чтобы сразу это всё выполнить можно было  smile

Ага.. Но это невозможно.. :( Вот теперь нужно думать.. Как запихнуть факты в файл.. Сначала ведь все блоки пусты, а если в блок что-то добавляется, нужно написать с какого по какое место в блоке, название файла и ещё кучу ненужного дерьма, чтоб потом ещё и дефрагментацию сделать :(((( А в блок могут ещё и несколько файлов поместиться.. И как это всё записывать в файл? И вообще, можно прыгать на определённую строку в файле? По номеру? Эх.. Запить что ли..  smile 

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


Крокодил
**


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

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



Да ну вас.. привыкли с оболочками работать.
кто мешает сделать формовку, на лету сгенерить файл, тут же вызвать компилятор, компильнуть, проверит наличие эхе-шника и запустить. а можно под это дело и makefile соорудить. Да и вообще на елансе для тестовых задач есть такие приблуды, вводишь текст проги, она либо компиляет (тест пройден), либо ругается на ошибку.но я там походу с эскейп-последовательностями никак не разберусь, 100% нормальные тексты прог мне выдаёт в ответах как ошибочные.

Добавлено через 13 минут и 17 секунд
Цитата(Белоснежка @  13.8.2013,  01:21 Найти цитируемый пост)
И вообще, можно прыгать на определённую строку в файле? 

метки вроде ещё никто не отменял. правда, плохой стиль, говорят.
Цитата(Белоснежка @  13.7.2013,  00:56 Найти цитируемый пост)
для чего в этом проекте нужен malloc(), free()? Их нужно обязательно использовать..
чтобы показать преподавателю владение темой, а не то, что пиво пили в течение семестра. можно делать и со стаически выделенными кусками памяти, но с динамически - внушает.




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 13.8.2013, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Белоснежка @  13.8.2013,  02:21 Найти цитируемый пост)
И как это всё записывать в файл?

Не работайте с текстовым файлом. Работайте с бинарным. Разработайте формат записи оглавления для хранимого файла (фиксированного размера). Например:

Код

struct file_entry
{
  char name[256];    // имя файла
  unsigned int size;    // его размер
  time_t date;           // дата (создания?) файла
  unsigned int offset; // смещение в файле-хранилище, начиная с которого идёт содержимое этого файла
};


Пишите и читайте из файла-оглавления сразу всем массивом структур. Размер файла узнаётся функциями stat/fstat+fileno, запись и чтение блоков памяти - функциями fread/fwrite, перемещение по файлу - функцией fseek, позиция текущего указателя - ftell. Тогда число записей в файле-оглавлении определяется через (размер_файла-оглавления / sizeof(struct file_entry)), позиционирование указателя на запись номер N как fseek( f, N*sizeof(struct file_entry), SEEK_SET). 

Но я всё-таки предлагаю Вам каждый раз целиком в память читать содержимое файла-оглавления (вот и пригодятся malloc/free), в памяти с ним же и работать (добавить/удалить файл, дефрагментировать), затем целиком записать обратно (то есть полностью переписать файл-оглавление). Всё до безобразия просто, если отойти от строчной структуры)))


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


Новичок



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

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



Цитата(feodorv @ 13.8.2013,  04:56)
Но я всё-таки предлагаю Вам каждый раз целиком в память читать содержимое файла-оглавления (вот и пригодятся malloc/free), в памяти с ним же и работать (добавить/удалить файл, дефрагментировать), затем целиком записать обратно (то есть полностью переписать файл-оглавление). Всё до безобразия просто, если отойти от строчной структуры)))

Вот в этом месте у меня вопрос:
А что если файл-оглавление будет оооочень большим? Понимаете, задание обязует использовать оооочень большие числа/большое количество знаков.. И вообще меня всё достало :(

Другой вопрос: я когда создаю файл-содержимое, я создаю его определённого размера.. Но если в этот файл что-то записать, то его размер растёт... А мне нужен фиксированный. :( Как это сделать?
PM MAIL Skype   Вверх
bsa
Дата 20.8.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Белоснежка, а кто тебе мешает пользоваться lseek/fseek для смены позиции в файле? Установи позицию на середину и пиши. Только имей в виду, что в этом случае ты затрешь старую информацию. И с текстовыми файлами этот метод работает очень плохо (или надо делать фиксированную ширину строки, или использовать бинарный).
PM   Вверх
Белоснежка
Дата 20.8.2013, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 20.8.2013,  15:49)
Белоснежка, а кто тебе мешает пользоваться lseek/fseek для смены позиции в файле? Установи позицию на середину и пиши. Только имей в виду, что в этом случае ты затрешь старую информацию. И с текстовыми файлами этот метод работает очень плохо (или надо делать фиксированную ширину строки, или использовать бинарный).

А как сделать бинарный? Линуксовский компилятор игнорит букву "б" при открытие файла.. 
Любая функция записи в файл переписывает содержимое? А можно "удалить" запись неизвестной длины? Вот скажем я хочу удалить строчку номер 6367. Это реально без полной переписи файла?

Нам сказали, что из файла-оглавления минимум 2 блока поместятся в main memory. 
PM MAIL Skype   Вверх
feodorv
Дата 20.8.2013, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Белоснежка @  20.8.2013,  16:43 Найти цитируемый пост)
А что если файл-оглавление будет оооочень большим? 

Ну, если хранить в хранилище огромную кучу файлов длинной по 1 байту, то да, размер оглавления станет оооочень большим))))
Но это всё лирика. У Вас на один файл в оглавлении уходит 300 байт. Если даже запихнуть в хранилище 100.000 файлов, то размер оглавления составит 30мег, вполне терпимая цифра.
Более того, всегда от прямого чтения в память можно перейти к более изощрённым методам работы с оглавлением (mmap, переменный размер записи в оглавлении, просто указатели на записи в оглавлении и т.д.), но это можно будет сделать потом. Сейчас нужно наладить схему. И схема такова, что работать нужно с бинарным форматом, не строковым.


Цитата(Белоснежка @  20.8.2013,  16:43 Найти цитируемый пост)
задание обязует использовать оооочень большие числа/большое количество знаков..

Числа чего? Знаки чего? Каков порядок чисел (что значит "оооочень большие")? 


Цитата(Белоснежка @  20.8.2013,  16:43 Найти цитируемый пост)
И вообще меня всё достало :(

Ну так надо философски смотреть на вещи. Программирование требует выдержки, и даже ленности в некоторых вопросах)))) А вот меня, например, достаёт Ваше нежелание поделиться кодом, приходится всё додумывать, и не поймёшь ещё при этом, правильно или нет...


Цитата(Белоснежка @  20.8.2013,  16:43 Найти цитируемый пост)
Другой вопрос: я когда создаю файл-содержимое, я создаю его определённого размера.. Но если в этот файл что-то записать, то его размер растёт...

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


Цитата(Белоснежка @  20.8.2013,  16:43 Найти цитируемый пост)
Как это сделать? 

Ответ был дан, и неоднократно:
Цитата(bsa @  20.8.2013,  16:49 Найти цитируемый пост)
а кто тебе мешает пользоваться lseek/fseek для смены позиции в файле?

После того, как файл-хранилище был создан (не более 2 гигабайт, иначе придётся менять способ доступа к нему), он открывается на чтение-запись "r+", чтобы в него что-то записать. Текущая позиция в файле при этом - ноль. Она меняется посредством вызова fseek. Но если файл отрывается на "append" - "a+", то любая запись будет осуществлена в конец файла, при этом его размер увеличится. Вопрос: как Вы открываете файл-хранилище?

Добавлено через 9 минут и 18 секунд
Цитата(Белоснежка @  20.8.2013,  17:58 Найти цитируемый пост)
А как сделать бинарный?

В Линуксе/Юниксах это без разницы, любой файл - бинарный. Просто структура у него не строковая, а иная. В бинарном файле могут встречаться "непечатные" символы, даже символ '\0'.


Цитата(Белоснежка @  20.8.2013,  17:58 Найти цитируемый пост)
Любая функция записи в файл переписывает содержимое?

Если не писать в конец файла, то да.


Цитата(Белоснежка @  20.8.2013,  17:58 Найти цитируемый пост)
Вот скажем я хочу удалить строчку номер 6367. Это реально без полной переписи файла?

Так не выйдет, если хочется высвободить то место, которое ранее занимала строчка. Но опять-таки, откуда такая любовь к строчкам?


Цитата(Белоснежка @  20.8.2013,  17:58 Найти цитируемый пост)
Нам сказали, что из файла-оглавления минимум 2 блока поместятся в main memory.  

Опять не понятно. Почему "минимум", почему "два", что такое "блок"...


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


Эксперт
****


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

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



Цитата(Белоснежка @  20.8.2013,  17:58 Найти цитируемый пост)
А как сделать бинарный? Линуксовский компилятор игнорит букву "б" при открытие файла..
кроме буквы "b" еще надо и методы записи использовать соответствующие: fwrite/fread, вместо fputs/fgets/fprintf/fscanf.


PM   Вверх
Белоснежка
Дата 5.10.2013, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извините, вопрос исчерпан.. Неожиданным образом.,.. 

Это сообщение отредактировал(а) Белоснежка - 5.10.2013, 23:48

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  oshibka.JPG 135,97 Kb
PM MAIL Skype   Вверх
bsa
Дата 10.10.2013, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Белоснежка, расскажешь каким?
PM   Вверх
Белоснежка
Дата 11.10.2013, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я практически полностью переписала код. Не использовала мэллок, только кэллок.. И вообще всё вдруг пошло как по маслу... Были мелкие проблемы из-за невнимательности. В общем всем спасибо.. Мне видимо нужно было один раз написать о своей проблеме и я сразу находила решение )) Всё готово, всё прошло. Спасибо. smile
PM MAIL Skype   Вверх
bsa
Дата 11.10.2013, 11:52 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Белоснежка @  11.10.2013,  02:54 Найти цитируемый пост)
Мне видимо нужно было один раз написать о своей проблеме и я сразу находила решение )) Всё готово, всё прошло.
Это классический метод разрешения проблем. В процессе рассказа кому-нибудь или его вопросов ты сама находишь корень проблемы.

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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