![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
AmsTaFF |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.9.2009 Где: г. Москва Репутация: нет Всего: нет |
пишу курсоовую по С/С++, надо написать БД студентов.
проблема такова - нельзя засорять память всеми записми одновременно, и есть несколько вопросов 1. при открытии файла, он весь заносится в оперативную память? (например 2ГБ файл будет) 2. как можно собрать список(массив) файлов по шаблону, например "student_Num_%d.dat", вместо %d - ID записи идея в том, чтобы подгружать файлы с нужными ID когда понадобятся, а потом обратно выгружать из памяти. буду очень благодарен, если будет пример кода, не всего конечно же, но чтобы понять как... , ибо сколько я не искал - по большей части проблемы в синтаксисе и с типами данных (не понимаю как переводить из LPCWSTR в const char * например) или используется Visual и такие конструкции, которые я пока понять не могу... Это сообщение отредактировал(а) AmsTaFF - 12.11.2009, 15:39 |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
AmsTaFF,
1) нет, пока сам не скопируеш в память 2) для винды - поиском, FindFirst, FindNext |
|||
|
||||
AmsTaFF |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.9.2009 Где: г. Москва Репутация: нет Всего: нет |
1. значит я могу открыть файл размером 1ГБ и он не будет помещен в ОЗУ, и только при считывании данных из него в переменные будет выделяться память? (извините за такие вопросы, но нету ни пособий, ни книжек нормальных в данный момент)
2. да, я уже видел пример с этим, но я не смог его запустить, есть ли пример работы с данными ф-циями? |
|||
|
||||
Kipter |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 2.5.2006 Репутация: нет Всего: нет |
Операция открытия файла в стандартной библиотеке Си или Си++ не подразумевает его копирование в память, ты всего лишь получаешь Дескриптор этого фаила (своеобразный указатель на фаил выдаваемый операционной системой) если помнишь указатели не хранят значений а только на них указывают =) А при передаче указателя значения не копируются, так и дескриптор это какое то число - адрес для операционной системы по которому ты можешь получить доступ к файлу (т.е массиву байтов) а дальше ты уже считываешь нужные тебе значения с помощью функций что то вроде read, указывая ей дескриптор, начальную и конечную позицию, ну или чем ты там пользуешься для чтения данных. |
|||
|
||||
AmsTaFF |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.9.2009 Где: г. Москва Репутация: нет Всего: нет |
отлично, спасибо.
Тогда вопрос в догонку, как можно удалить запись из файла, например из бинарного файла структуру? слышал про ф-цию chsize, но не могу найти библиотеку, в которой она содержится... не подскажете? или она Linux'овая, как и ftruncate? |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
AmsTaFF, это делается только перезаписью файла
или перемещением структур в файле и отрезанием его конца |
|||
|
||||
Enelar |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 13.1.2008 Репутация: нет Всего: 1 |
внесу свой небольшой вклад.
если не хотите париться с функциями финд ферст финд некст, можно завести фаил в котором будут храниться имена файлов и соответствия индексам. а что бы не загружать прогу сильно создать еще один, в котором будет писаться - удален ли id. А первый перезаписывать когда второй большим стал или времени много стало. |
|||
|
||||
AmsTaFF |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.9.2009 Где: г. Москва Репутация: нет Всего: нет |
2Abyx
отрезание конца тоже подходит, но вопрос - как? я не смог найти в библиотеке ф-ции для решения данной проблемы... 2Enelar хм, интересненько, попробую сделать |
|||
|
||||
Kipter |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 2.5.2006 Репутация: нет Всего: нет |
AmsTaFF,
Я вот точно сказать не могу есть ли кросс-платформенный способ усечения фаила, но если вы пишите под OS Windows то погуглите или поищите на форуме такую функцию как: _chsize или SetEndOfFile Далее, был у меня такой случай, что в фаиле я хранил набор неких структур, но каждая структура была всегда одного и того же размера. Что я делал: от начала фаила записывал эти одинаковые по размеру структуры последовательно... как только какую либо из записей нужно было удалить, то в конец фаила просто записывался индекс удаленной структуры. При добавлении новой структуры, проверялось нет ли на конце фаила индексов удаленных структур, если есть то на их место записываем новую, а индекс удаляем из конца очереди - урезанием фаила (SetEndOfFile) данный метод подходит только если структуры фиксированного размера =) Впрочем вы можете написать и более сложную систему хранения ваших данных на принципе работы фаиловых систем. И такой хренью маился, правда уже ради интереса. Данные могут быть уже любого размера и начинаются с заголовка в котором указан размер данных, и флаг - последний ли это блок или где то есть продолжение, если продолжение есть то его позицию, а там следовательно следующий заголовок. При удалении блоков, начальные и конечные их позиции заносяться в таблицу свободных мест, которые позже могут быть использованы для записи новых блоков. Ну а когда велосипеды надоели, я просто стал прилинковывать к проектам бесплатную БД sqlite и хранить данные уже в ней, чего и вам желаю =) Это сообщение отредактировал(а) Kipter - 13.11.2009, 09:52 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |