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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с файлами, или как не загадить память 
:(
    Опции темы
AmsTaFF
Дата 12.11.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



пишу курсоовую по С/С++, надо написать БД студентов.

проблема такова - нельзя засорять память всеми записми одновременно, и есть несколько вопросов

1. при открытии файла, он весь заносится в оперативную память? (например 2ГБ файл будет)
2. как можно собрать список(массив) файлов по шаблону, например "student_Num_%d.dat", вместо %d - ID записи идея в том, чтобы подгружать файлы с нужными ID когда понадобятся, а потом обратно выгружать из памяти.

буду очень благодарен, если будет пример кода, не всего конечно же, но чтобы понять как... , ибо сколько я не искал - по большей части проблемы в синтаксисе и с типами данных (не понимаю как переводить из LPCWSTR в const char * например) или используется Visual и такие конструкции, которые я пока понять не могу...

Это сообщение отредактировал(а) AmsTaFF - 12.11.2009, 15:39
PM MAIL ICQ Skype   Вверх
Abyx
Дата 12.11.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



AmsTaFF
1) нет, пока сам не скопируеш в память
2) для винды - поиском, FindFirst, FindNext
PM MAIL   Вверх
AmsTaFF
Дата 12.11.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1. значит я могу открыть файл размером 1ГБ и он не будет помещен в ОЗУ, и только при считывании данных из него в переменные будет выделяться память? (извините за такие вопросы, но нету ни пособий, ни книжек нормальных в данный момент)
2. да, я уже видел пример с этим, но я не смог его запустить, есть ли пример работы с данными ф-циями?
PM MAIL ICQ Skype   Вверх
Kipter
Дата 12.11.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(AmsTaFF @  12.11.2009,  19:38 Найти цитируемый пост)
1. значит я могу открыть файл размером 1ГБ и он не будет помещен в ОЗУ, и только при считывании данных из него в переменные будет выделяться память? (извините за такие вопросы, но нету ни пособий, ни книжек нормальных в данный момент)


Операция открытия файла в стандартной библиотеке Си или Си++ не подразумевает его копирование в память, ты всего лишь получаешь Дескриптор этого фаила (своеобразный указатель на фаил выдаваемый операционной системой) если помнишь указатели не хранят значений а только на них указывают =) 
А при передаче указателя значения не копируются, так и дескриптор это какое то число - адрес для операционной системы по которому ты можешь получить доступ к файлу (т.е массиву байтов)

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

PM MAIL   Вверх
AmsTaFF
Дата 13.11.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



отлично, спасибо.

Тогда вопрос в догонку, как можно удалить запись из файла, например из бинарного файла структуру?

слышал про ф-цию chsize, но не могу найти библиотеку, в которой она содержится... не подскажете? или она Linux'овая, как и ftruncate?
PM MAIL ICQ Skype   Вверх
Abyx
Дата 13.11.2009, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



AmsTaFF, это делается только перезаписью файла
или перемещением структур в файле и отрезанием его конца
PM MAIL   Вверх
Enelar
Дата 13.11.2009, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



внесу свой небольшой вклад.
если не хотите париться с функциями финд ферст финд некст, можно завести фаил в котором будут храниться имена файлов и соответствия индексам. а что бы не загружать прогу сильно создать еще один, в котором будет писаться - удален ли id.
А первый перезаписывать когда второй большим стал или времени много стало.
PM MAIL   Вверх
AmsTaFF
Дата 13.11.2009, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2Abyx
отрезание конца тоже подходит, но вопрос - как? я не смог найти в библиотеке ф-ции для решения данной проблемы...

2Enelar
хм, интересненько, попробую сделать
PM MAIL ICQ Skype   Вверх
Kipter
Дата 13.11.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



AmsTaFF
Я вот точно сказать не могу есть ли кросс-платформенный способ усечения фаила, но если вы пишите под OS Windows то погуглите или поищите на форуме такую функцию как:  _chsize или SetEndOfFile

Далее, был у меня такой случай, что в фаиле я хранил набор неких структур, но каждая структура была всегда одного и того же размера.
Что я делал:
от начала фаила записывал эти одинаковые по размеру структуры последовательно...
как только какую либо из записей нужно было удалить, то в конец фаила просто записывался индекс удаленной структуры.
При добавлении новой структуры, проверялось нет ли на конце фаила индексов удаленных структур, если есть то на их место записываем новую, а индекс удаляем из конца очереди - урезанием фаила (SetEndOfFile)

данный метод подходит только если структуры фиксированного размера =)

Впрочем вы можете написать и более сложную систему хранения ваших данных на принципе работы фаиловых систем.
И такой хренью маился, правда уже ради интереса. Данные могут быть уже любого размера и начинаются с заголовка в котором указан размер данных, и флаг - последний ли это блок или где то есть продолжение, если продолжение есть то его позицию, а там следовательно следующий заголовок. При удалении блоков, начальные и конечные их позиции заносяться в таблицу свободных мест, которые позже могут быть использованы для записи новых блоков.

Ну а когда велосипеды надоели, я просто стал прилинковывать к проектам бесплатную БД sqlite
и хранить данные уже в ней, чего и вам желаю =)



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

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

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

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

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


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

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


 




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


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

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