![]() |
|
Модераторы: bsa |
![]()
|
|
| A1Exey |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.5.2009 Репутация: нет Всего: нет |
Доброго времени суток! Заранее скажу что поиск юзал =)
Вводные данные: Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого доступа, выполнить задание по своему варианту. Структура имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков. Создаю структуру:
С помощью ф-ии NewFile(FILE *) создаю новый файл и вношу в него необходимые записи:
Интересует вопрос: как удалить какую - либо запись из файла? Для начала без сортировки(не по заданию), а допустим по фильтру вводимому с клавиатуры, по полю number структуры sportsman. Написал такую функцию:
Т.е. вводим с клавиатуры num,далее последовательно считываем все структуры из файла,в случае если введенный num совпадает с sportsman.number - перемещаем указатель на начало найденной структуры, и прописываем в это место NULL:
Не работает..зараза....подскажите что не так делаю? Вот полный текст программы с комментариями:
Это сообщение отредактировал(а) A1Exey - 18.2.2010, 11:17 |
||||||||||
|
|||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
fwrite(NULL,sizeof(data),1,fp); эта операция вызовет сбой программы, так как NULL указывает в никуда.
Удалить запись из файла без его пересоздания нельзя. Можно ввести в структуру еще одно поле, которое будет означать, что запись удалена. Можно удалить старый файл и на его месте создать новый. |
|||
|
||||
| A1Exey |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.5.2009 Репутация: нет Всего: нет |
Т.е. предварительно нужно считать все структуры(за исключением удаляемой) из файла в динамический массив, после чего заново создать файл и прописать туда считанные структуры? P.S.: тогда возникает еще один вопрос - как быть в случае с файлами большого размера?(>1Gb к примеру) Это я так, из познавательных целей интересуюсь. Это сообщение отредактировал(а) A1Exey - 18.2.2010, 12:44 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Но, как уже успел заметить azesmcar, базы данных именно для этих целей и создавались. Поэтому логичней использовать именно их в этом случае. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Насколько я понял автору нужно выполнить какое-то задание (курсовую, контрольную ets.)
поэтому совет использовать СУБД, наверное, не подойдёт, а вот создание нового файла с удаленной структурой - нормальный вариант, при этом необязательно считывать весь первый файл в память, достаточно считывать по одной структуре, и - если она не удовлетворяет условию удаления - записывать её в выходной файл P.S. последний параметр == 2, или SEEK_END, так, что этот код будет отступать не назад от текущего положения, а на sizeof(data) от КОНЦА файла. Чтобы отступить назад нужно указать
кстати, предпочтительнее указывать константы (define'ы), чтобы код понятней был Это сообщение отредактировал(а) borisbn - 18.2.2010, 14:14 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
хотелось бы обратить ваше внимание
|
||||
|
|||||
| A1Exey |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.5.2009 Репутация: нет Всего: нет |
Всем спасибо за помощь! Реализовал через динамический массив, однако столкнулся со некоторыми проблемами...
Изменил ф-ю SearchFile, теперь алгоритм выглядит так: 1) Файл открывается в режиме "rb", происходит подсчёт кол-ва записанных в файл структур:
2) Указатель чтения переводится на начало файла, создаётся динамический массив, все записи из файла последовательно считываются в массив, файл закрывается:
3) Файл открывается в режиме "wb", считанный массив сортируется "инвертированным" алгоритмом пузырьковой сортировки(самый лёгкий элемент опускается вниз), после чего массив записывается в файл, за исключением последнего элемента(он откидывается по условию задачи):
Сталкиваюсь с проблемой в пунктах 1 и 2. Допустим что мы записали в файл 4ре структуры, однако значение переменной n после считывания содержимого файла равняется 5(пяти). Что ещё оно считывает? Полный текст функции SearchFile():
Полный текст программы можно посмотреть в первом сообщении, изменена только ф-я SearchFile. Дополнение: после запуска ф-ии SearchFile некоторые структуры считанные из файла записываются во вновь созданный файл по 2 раза. Логически вроде бы я всё правильно написал, подскажите что не так? :(%-)
|
||||||||||
|
|||||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
1. Количество записей в файле проще вычислить так
а лишний fread в твоем коде возвоащает количество считанных записей равное 0. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| A1Exey |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.5.2009 Репутация: нет Всего: нет |
Логически вроде Вы правильно написали, однако поправил в коде:
и теперь переменная n = 0 (кол-во считанных записей), что до считывания, что после считывания. Что то не так... |
||||||
|
|||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
потому что указатель находится в конце файла.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| A1Exey |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.5.2009 Репутация: нет Всего: нет |
Указатель находится в конце файла, соответсвенно
должен возвращать количество записанных в файл элементов. |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
дико извиняюсь, fseek не возвращает положение указателя в файле. Нужно вот так:
sorry, sorry -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| A1Exey |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.5.2009 Репутация: нет Всего: нет |
borisbn , спасибо!
Заменил цикл подсчёта записанных структур:
на
и всё заработало...правда так и не понял, почему после первой попытки (считать кол-во структур циклом), оно возвращало на один элемент больше чем было реально записано в файл...может кто нибудь расскажет? Если кому - либо интересно выкладываю полный текст рабочей ф-ии SearchFile():
|
||||||
|
|||||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
нужно было
но это дольше, чем, fseek/ftell -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
![]()
|
| Правила форума "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. |