Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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 '- Рандом запрещает (не рекомендуется). Бинари разрешает.
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)
'1.
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
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()
    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 байт - снова готика получается :)
Так вот как вариант - заголовок. Оптимально по соотношению размер/скорость, только кода поболе.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам