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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование malloc(), free() с файлами 
V
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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