Страница: 1 |
Страница: 1 |
Вопрос: О файле произвольного доступа!
Добавлено: 17.04.06 19:03
Автор вопроса: DJ MATHEMATIC
1.У меня такая проблема: В файле произвольного доступа ( при нажатии command1) нужно удалить
запись record из файла (для этого копируем необходимые записи в новый файл,старый удаляют,новому файлу дают имя старого)...Вот эта запись record:
Public Type Air
NumberTrip As Byte
PointPlace As String
TimeArrive As Integer
TimeLeave As Integer
FreePlace As Integer
End Type
Public record As Air
2.Каким образом можно вычислить количество существующих записей в файле (путем использования LOF(номер файла) и размера записи...Можно любым другим способом
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 17.04.06 19:48
LOF(n) / Len(record)
вроде бы...
Номер ответа: 2
Автор ответа:
Nj
ICQ: 223663115
Вопросов: 21
Ответов: 285
Профиль | | #2
Добавлено: 17.04.06 23:28
2. По идее, можнопри сохранении файла куда-то еще (в реестр или другой файл настроек) сохранять количество записей или бинарным доступом сохранять прямо в сам файл с записями их количество. А вообще, записи в Рандом-режими можно сказать пронумерованы, т.е. все одинаковой длины, поэтому их кол-во можно определить по EOF. При бинарном - хуже.
И еще, по-моему, бэйсик запрещает в рандом файлы писать типы в которых переменная типа стринг задекларированы без длины, т.е.
PointPlace As String * 50 '- Надо.
Определись - ты пишешь рандомом или бинари?
Номер ответа: 3
Автор ответа:
DJ MATHEMATIC
Вопросов: 17
Ответов: 18
Профиль | | #3
Добавлено: 18.04.06 19:14
Ну вы подскажете как удалить записи таким образом???))
Номер ответа: 4
Автор ответа:
Nj
ICQ: 223663115
Вопросов: 21
Ответов: 285
Профиль | | #4
Добавлено: 24.04.06 13:48
Нужно считать весь файл в массив типа Air, а потом когда нужно удалить будет запись,
внеси к примеру в переменную
PointPlace строку "*" и перед записью всего файла проверять - если PointPlace ="*" то эту запись не вносим в файл.
Пробую кодом - (я почти не работал с произв. доступом и мог забыть синтаксис операторов Get и Put)
dim AirRecords() as Air
'2.
open "AirFile.rdm" for random as #1
'Определяем сколько записей и размер массива
redim AirRecords((LOF(#1) / Len(DlinaZapisiAir))-1)
'3.
'Считываем весь файл при запуске проги
for x=0 to AirRecords.Ubound
Get #1,x,AirRecords(x) 'кажется так
next x
close #1
'4.
'Допустим надо удалить запись номер 31
AirRecords(31).PointPlace="*"
'5.
'Сохраняем файл к примеру перед закрытием программы
' Стираем старый вариант файла
kill "AirFile.rdm" 'Стирает не в корзину, пробуй аккуратнее
'6.
'Записываем новый
open "AirFile.rdm" for random as #1
for x=0 to AirRecords.Ubound
if AirRecords(x).PointPlace<>"*"
Put #1,AirRecords(x) 'кажется так
end if
next x
close #1
По идее, в новый файл не просочатся удаленные записи. Самому даже инитересно - работает это?
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 24.04.06 13:57
Как вариант - дописывать заголовок в конец файла. В нем помечать номера записей, их начало и длину.
Скажем, при удалении можно удалить запись физически, если она последняя, или пометить в заголовке как удаленную - если в середине (в будущем при добавлении новой записи производится проверка по заголовку. Если есть удаленные - пишем поверх них, иначе - дописываем в конец).
В общем, по принципу файловой системы. А вообще, файл произвольного доступа используется когда размер записи фиксирован. В противном случае лучше искать варианты, либо бинари с заголовком, либо что-нить в стиле рекордсета и т.п.
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 25.04.06 23:45
Народ, а чём речь??? Зачем что-то дописывать? Когда файл пишется в бинарном режиме, получить кол-во элементов массива структуры довольно просто! размер файла поделить на размер структуры = кол-во элементов! потом Redim наш массив и Get #1, ,структуру !
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 26.04.06 11:40
Хм...
Сможешь определить длину этой записи? И сохранить её как запись фиксированного размера?
Public Type Air
NumberTrip As Byte
PointPlace As String
TimeArrive As Integer
TimeLeave As Integer
FreePlace As Integer
End Type
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 26.04.06 15:14
NumberTrip As Byte
PointPlace As String
TimeArrive As Integer
TimeLeave As Integer
FreePlace As Integer
End Type
Dim q As Air
Private Sub Form_Load()
MsgBox Len(q)
End Sub
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 26.04.06 15:19
Option Explicit
Private Type Air
NumberTrip As Byte
PointPlace As String
TimeArrive As Integer
TimeLeave As Integer
FreePlace As Integer
End Type
Dim q As Air
Private Sub Form_Load()
q.PointPlace = "Ну, как бы это сказать, данная запись кажется немного длиннее чем " & Len(q) & " байт. Мое ИМХО, конечно."
MsgBox Len(q)
MsgBox q.PointPlace
End Sub
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 26.04.06 15:21
и чё фиксированного?, про бинари речь шла...
Open "C:\1.bin" for binary as #1
Put #1, , q
Close #1
Номер ответа: 11
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #11
Добавлено: 26.04.06 15:23
ну запас возьми
PointPlace As String * 100 Ж)))))
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 26.04.06 15:36
Open "C:\1.bin" for binary as #1
Put #1, , q
Close #1..
Выполнил, файл создал. 102 байта. Делим на len(q) - в файле 9,272 записи. HACKER, твой совет определенно рулит.
PointPlace As String * 100
Тебе про это и сказали. Но если я из этих 100 использую 5 байт - снова готика получается
Так вот как вариант - заголовок. Оптимально по соотношению размер/скорость, только кода поболе.