187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|||||||||||
1 | |||||||||||
Удалить записанный экземпляр класса из двоичного файла24.10.2012, 07:18. Показов 2615. Ответов 34
Метки нет (Все метки)
Задача - удалить записанный экземпляр класса из дв. файла.
(В моём решении, удаленный экземпляр просто затирается последним)
Отчего такая феерическая ошибка? Может ли быть так, что, когда я сделал fseek на последнюю запись и считал её (ушел в EOF), то как-то нарушил всю суть работы? Хотя PrintFile после возврата каретки на текущую запись всё же отработал D: Добавлено через 6 минут Вместо X-ACTION можно вставить и такое. Тоже поможет :
0
|
24.10.2012, 07:18 | |
Ответы с готовыми решениями:
34
Можно ли считывать поля класса из двоичного файла одним fread Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса Удалить экземпляр класса в массиве Сборщик мусора (как удалить экземпляр класса) |
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
24.10.2012, 15:44 [ТС] | 3 |
alsav22, что значит "сбросить флаги"? И почему тогда работает даже после EOF при том хаке, что я написал?
Добавлено через 21 минуту и что это значит?
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||||||||||||
29.10.2012, 14:37 [ТС] | 5 | |||||||||||||||
alsav22, а, не, я через FILE* работаю.
Добавлено через 30 минут Файл открыт r+b. Есть ли какие-либо особенности при работе с файлом, который открыт одновременно для чтения и записи, когда я в него записываю и читаю? Добавлено через 5 часов 27 минут Такое ощущение, что фокус в инкапсуляции какой-то.. Изменил всё на FILE*& и FILE**&, в итоге зайдя ещё глубже (из функции чтения передав в ещё одну функцию чтения свой файл), получил опять ту же проблему.. Будет ли какая-то разница, с каким из этих указателей работать?
Новый-старый фокус.
up-to-date Добавлено через 7 часов 57 минут Как сказал преподователь по ОС, это может быть из-за того, что, переходя в функцию, создается новый конекст файла, а когда я возвращаюсь из функции, забираю предыдущий контект (который теперь почему-то испорчен). fseek просто обновляет контект, поэтому и решает проблему. Вопрос, как же тогда пользоваться контекстом?
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.10.2012, 16:24 [ТС] | 7 |
alsav22, вроде бы как я писал, что везде поставил FILE*&..
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
29.10.2012, 16:39 | 9 |
Можете весь код выложить? А то не совсем понятно что у Вас происходит. По сути Вы достигаете eof при считывании последнего экземпляра. Устанавливается флаг EOF. fseek само собой его убирает. Подробней вот тут - http://www.cplusplus.com/refer... tdio/feof/
Нужная Вам часть:
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.10.2012, 17:04 [ТС] | 10 |
Toshkarik, ага, а потом всё равно происходят ошибки, ведь после того, как я считал последнюю запись, я возвращаюсь не местоположение той, которую надо перезаписать и перезаписываю её, а затем, считывая следующую запись, я получаю ошибку.
Кода слишком много. Никто читать не будет >_<" Лишь напугает тех, кто хочет помочь. Описания проблемы будет достаточно. Если что-то непонятно, то так и скажите. Попытаюсь описать детальнее
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
29.10.2012, 17:09 | 11 |
nexen, потому что снова ставится EOF. Поставьте assert`ы feof() и посмотрите сами.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.10.2012, 17:50 [ТС] | 12 |
Toshkarik, но почему? Ведь записываю я уже не в конец файла ><
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
29.10.2012, 17:58 | 14 |
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||
29.10.2012, 18:09 [ТС] | 15 | |||||
Toshkarik, так в том то и дело, что он сбросился fseek'ом, как ты и сказал.
Покажу на примере. В файле : 4 1 2 3 4. Первое число - кол-во записей, остальное - данные. Считываю 4.
Это требуемые к удалению данные. Перемещаюсь на начало 4 (предпоследняя запись, которую я смотрю не по SEEK_END, а по count). Считываю 4ку. EOF Перемещаюсь на начало 1. (EOF сбрасывается) Записываю 4. (EOF не ставится, ибо не конец файла) *В файле сейчас : 4 4 2 3 4* Уменьшаю count на 1. Считываю запись с текущего места (то есть должна быть 2ка, но тут происходит не пойми что и считывается как будто пара байт из 4ки и пара байт из 2ки и выходит 00 00 02 00 (если уже к примеру говорить). Предположим, ошибки нет, то в конце перезаписываю count и получается файл : 3 4 2 3 4. Так же, так как for идет до count, а я его уменьшил, то до EOF он уже никогда не дойдет Запись 1 - удалена.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
29.10.2012, 18:30 | 16 |
Покажите, как Вы вызываете fseek.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.10.2012, 18:52 [ТС] | 18 |
Toshkarik, в первом сообщении темы. Строки 17-20.
alsav22, ну это я для наглядности. Пробелов нет. Записываемые классы представляют из себя строго фиксированную последовательность байт. vector/string или подобные нет. Только char*. Только с одинаковым new[STRING_SIZE].
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
29.10.2012, 19:20 [ТС] | 20 |
alsav22, планирую добавить удаление не только по id, так что оставил так.
0
|
29.10.2012, 19:20 | |
29.10.2012, 19:20 | |
Помогаю со студенческими работами здесь
20
Создать экземпляр метода класса или доступ к методу из экземпляра класса Как получить ссылку на текущий экземпляр класса внутри этого класса? Экземпляр класса как входные данные метода другого класса Создание указателя типа базового класса на экземпляр производного класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |