![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
admin82 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 22.8.2006 Репутация: нет Всего: 1 |
Всем добрый! Пробую тут после Delphi осилить С++ (в VC2005), и вот первая проблема:
Перед этим файл Base открыт так:
Abonent -- структура, соответственно, и файл состоит из записей такого типа. Функция void VyvodFile(fstream& Base) должна всего лишь его вывести на экран. Так вот, последняя запись файла выводится на экран дважды, и ничего с этим поделать не могу. Ваши предположения? И еще. Ввод новых записей и редактирование я сделал, а как удалить запись из файла? Это сообщение отредактировал(а) admin82 - 22.8.2006, 13:29 |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Читать нужно не до eof, а до того момента, как read вернет 0.
Нужно иметь в виду, что состояние eof возникает не тогда, когда позиция чтения достигает конца файла, а когда делается попытка читать за концом файла. Таким образом, последняя итерация возвращает 0 байтов, буфер не перезаписывается, и ты еще раз выводишь строку. Нужно так:
-------------------- ... |
|||
|
||||
admin82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 22.8.2006 Репутация: нет Всего: 1 |
Супер, спасибо!!!!!!
Только надо еще в теле цикла писать
А как удалить запись из файла? Является ли приемлимым решение очистить значение всех полей? Видимо нет, так как запись останется существовать.... Это сообщение отредактировал(а) admin82 - 22.8.2006, 14:48 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Для чтения - не надо.
Удалить - значит переместить все последующие записи вперед. Очевидно, для файла это неприемлимо. Проще всего ввести a запись флаг и помечать удаленные записи. Иногда - упаковывать, т.е. переписывать из старого файла в новый, только непомеченные записи. -------------------- ... |
|||
|
||||
admin82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 22.8.2006 Репутация: нет Всего: 1 |
А почему неприемлимо?
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Потому что для этого придется перезаписывать весь файл.
-------------------- ... |
|||
|
||||
admin82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 22.8.2006 Репутация: нет Всего: 1 |
Но ведь при варианте с флагом мы просто можем не выводить на печать помеченные на даление записи, не выполнять поиск среди них. А размер файла будет расти. Пусть задача у меня учебная, но ведь это все равно не выход. В Паскале такое возможно... А кто будет производить упаковку в случае серьезного проекта (пусть там, конечно, и не ипользовалось бы такое хранение данных)? Не верю, что просто нельзя сфокусироваться на определенной записи и удалить ее
Это сообщение отредактировал(а) admin82 - 23.8.2006, 09:15 |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: нет Всего: 34 |
Паскаль испоьзует почти теже функции, что и си, но в паскале я такого не видел. Приведи пример на паскале как это сделать, или хотя-бы название функции |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Ну допустим ты заполнил нулями определенное количество байт, которые соответствуют структуре но размер файла у тебя останется прежним Можно просто сдвинуть на место удаляемой записи все остальные и образовавшееся место в конце файла заполнить нулями тогда при чтении нужно кроме того будет проверять, не прочитали ли мы одни нули, если да то дальше можно не читать. Однако при таком подходе иногда могут быть неприятности (чтение последовательности 0-вых байт в общем случае не есть признак конца) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Это как? Речь-то идет о файле. Фактически получается полное переписывание файла (для начальных записей). Вот разработчики DBF так не считали. Кто будет упаковывать - твой код, конечно, время от времени или по команде. Дело-то не сложное, просто относительно долгое, поэтому использовать для оперативного удаления нельзя. -------------------- ... |
|||
|
||||
admin82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 22.8.2006 Репутация: нет Всего: 1 |
Нет у меня сейчас делфы по рукой, как не искал. Но года два назад писал программу для тестирования учащихся, и вот там вопросы с вариантами ответов находились в типизированном файле. Эти файлы можно было создавать в одном из режимов программы для новых тем. И можно было редактировать. Хоть убей, не помню, как я это делал, но и не припоминаю, чтобы у меня это вызвало тогда затруднения.
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
И можешь дать 100% гарантию, что там не было пометки записей? Просто Дельфи заточен на работу с БД и многое делает сам, тебя не спрашивая.
При этом не исключен вариант и с физическим удалением записи (т.е. уплотнением файла при каждом удалении). При небольших размерах файла ты бы этого не заметил. А может, все записи в память считывались и редактировались там. -------------------- ... |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
с помощью tellp, seekp, read, write
так и получается -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
admin82 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 22.8.2006 Репутация: нет Всего: 1 |
Могу. Программу то я писал, и что такого не делел, помню наверняка. На автомате вельфи бы ничего с файлом не сделал, это все же не БД была.
А вот это более вероятно. Может, и так. Ну а если подвести итог, то всем спасибо за участие. С удалением что-нибудь уже придумаю. Приятно было получить столько ответов. ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |