Работа с файлом последовательного доступа.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
cg_ck
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 11.06.2003 (Ср) 12:02
Откуда: Riga(Latvia)

Работа с файлом последовательного доступа.

Сообщение cg_ck » 31.07.2003 (Чт) 2:14

Ситуация: огромная база данных, которая создавалась по сраедствам
open блаблабла for append as #1вся база создовалась именно таким образом
Теперь вопрос:
Как можно удалить строку из файла, если известно, какая это строка по счёту, и как можно изменить строку в фале если известно какая это строка по счёту.
Варианты с временными файлами не совсем пододят, это отразится на быстродействии программы не в лучшуу сторону.


Зарнее благодарен.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 31.07.2003 (Чт) 3:16

Советую перейти на нормальную базу данных типа Акссесовскую.
А то мучаться будешь долго....и мучительно:)
Если базу вручную переписать нет возможности, напиши парсер файлика, и загони его в базу. проще будет :wink:

Сплю я уже....не принимайте всерьез орфографические и грамматические ошибки :D
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

cg_ck
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 11.06.2003 (Ср) 12:02
Откуда: Riga(Latvia)

Сообщение cg_ck » 31.07.2003 (Чт) 13:58

Естественно то что ты говоришь, это замечательно. Именно так я и поступал в первых версиях своей программы. Но от сюда вытекло две проблемы(у меня):
1. Прошрамма не работаспособна если не установлен оффис.
2. Даже если установлена нужная версия оффисаЯ, программа всё равно вункцианирует с ошибками.
И ещё, нужна ли лицензия на использование акцесовских баз данных, если нет лицензии на офис(его попросту нет)
И в конце концов, программа уже почти завершена, всё кроме двух функций: Удалить и Редоктировать. Переписывать из=за этого весь код мне не хотелось бы.
Ходит по лесу хомяк, хищный маленький дурак...

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 31.07.2003 (Чт) 14:11

А насколько эта база
"огромна"? Если тебе в упор не хочется использовать Access, то, может, получится использовать принципы CSV базы (вся инфа в обычных текстовых файлах). Поинтересуйся, вдруг это подойдет...
P.S. Как то громко получилось - "принципы CSV базы":)

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 31.07.2003 (Чт) 15:10

cg_ck писал(а):Естественно то что ты говоришь, это замечательно. Именно так я и поступал в первых версиях своей программы. Но от сюда вытекло две проблемы(у меня):
1. Прошрамма не работаспособна если не установлен оффис.
2. Даже если установлена нужная версия оффисаЯ, программа всё равно вункцианирует с ошибками.
И ещё, нужна ли лицензия на использование акцесовских баз данных, если нет лицензии на офис(его попросту нет)
И в конце концов, программа уже почти завершена, всё кроме двух функций: Удалить и Редоктировать. Переписывать из=за этого весь код мне не хотелось бы.

По моему все что ты сказал фигня полнейшая. :wink:
Оффис тебе не нужен. Нужен только установленный компонент, который можно таскать с собой.
Поверь мне, отлаживать ошибки в mdb гораздо проще чем в текст файле.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

ПЕТР
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 23.07.2003 (Ср) 6:25
Откуда: г. Братск

Сообщение ПЕТР » 04.08.2003 (Пн) 10:00

Если тема еще интересует.
Посмотри в HELPe Get, Put и Seek
В общем то, никаких проблем передвигаешь указетель куда надо , читаешь, ложишь (главное открой файл в режиме Random или Binary) работает как в С причем быстро, ты можешь определить структуру RECORD понаписать там поля и читать, писать как в С.
На счет удаления это интересный вопрос, почто ты думаешь во всяких СУБД есть сжатие.
Я делал как DOS создал типа FAT и отмечал какая запись удалена.
и писал на то место. А можно просто удалять, а иногда делать сжатие.

cg_ck
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 11.06.2003 (Ср) 12:02
Откуда: Riga(Latvia)

Сообщение cg_ck » 06.08.2003 (Ср) 0:36

Здрасвуй Пётр, тема ещё интересует, и если не сложно, немного по подробней про удаление. Я не совсем понял что ты имел в виду.
Ходит по лесу хомяк, хищный маленький дурак...

ПЕТР
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 23.07.2003 (Ср) 6:25
Откуда: г. Братск

Сообщение ПЕТР » 06.08.2003 (Ср) 3:36

Ну вот я тут примерно набросал.
Я этот пример в Access пробовал, том просто удобнее

Option Compare Database
Option Explicit
'об'являем тип запись, поле f это специально для отметки как
'удаленная запись
Type rec
i As Long
t As String * 50
b As Byte
f As Boolean
End Type
Private r As rec
'---------------------------------
Private Sub MyWriteAll()
'создаем какой нибудь файл
Dim i As Long

Open "C:\p.p" For Random As #1 Len = Len(r)
For i = 1 To 120
r.b = 12
r.i = i
r.t = "Привет"
r.f = False 'это поле специальное для отметок как удаленная запись
Put #1, i, r
Next i
Close #1
End Sub
'----------------------------------------------
Private Sub MyReadAll()
' читаем все
Dim i As Long

Open "C:\p.p" For Random As #1 Len = Len(r)
i = 0
Do
i = i + 1
Get #1, i, r
If r.i > 0 Then
' можно например делать специальную установку выводить удаленные записи, не выводить
' If Not r.f Then
Debug.Print r.i, r.t, r.b, r.f
' End If
End If
Loop While Not EOF(1)
Close #1
End Sub
'-------------------------------------------
Private Sub MyReadRec(nRec As Long)
' чтение записи с определенным номером
Open "c:\p.p" For Random As #1 Len = Len(r)
Get #1, nRec, r
If EOF(1) Then
r.i = 0
End If
Close #1
End Sub
'----------------------------------------------------
Private Function MyDel(nRec As Long) As Long
' пометка записи с номером как удаленной
Dim RetVal As Long
Open "C:\p.p" For Random As #1 Len = Len(r)
Get #1, nRec, r
If EOF(1) Then
RetVal = 0
Else
r.f = True
Put #1, nRec, r
RetVal = nRec
End If
Close #1
MyDel = RetVal
End Function
'---------------------------------------------------------------
Private Sub MyWriteRec(nRec As Long, rW As rec)
'Write записи если nRec = 0 то ищем первую удаленную запись и пишем на ее место
'если nRec > 0 то пишем на запись с указанным номером
'ну тут нужно покумекать, запись в конец, если номер больше чем записей, ошибки и пр.

Dim i As Long

Open "C:\p.p" For Random As #1 Len = Len(r)
If nRec = 0 Then
i = 0
Do
i = i + 1
Get #1, i, r
If r.f Then
Exit Do
End If
Loop While Not EOF(1)
nRec = i
End If
rW.f = False
Put #1, nRec, rW
Close #1
End Sub
'------------------------------------------------------------
Private Sub MyMy()
'читаем определенную запись
MyReadRec (12)
Debug.Print r.i, r.t, r.b, r.f
End Sub
'-------------------------------------------
Private Sub MyMyDel()
' удаляем запись с номером
Dim ii As Long, nRec As Long
nRec = 12
ii = MyDel(nRec)
If ii > 0 Then
MsgBox ("Запись " & nRec & " Успешно помечена как удаленная")
End If
End Sub
'-----------------------------------------
Private Sub MyWrite()
'пишем запись на первую удаленную если она есть
Dim rww As rec
rww.i = 1222
rww.t = "До свидания"
rww.b = 128
Call MyWriteRec(0, rww)
End Sub

Ну вот, примерно в таком духе, конечно это набросок. Я думаю идею ты понял, имеем специальное поле для отметки и запись просто отмечаем как удаленную, а при работе с файлом нужно иметь ввиду что есть отметка об удалении.

Если файл данных большой, то желательно иметь на него, что-то вроде индексов. Допустим индекс на удаленные записи, там храняться номера удаленных записей, затем можно просто его открыть и прочитать первый номер, но для его обновления его придется всегда заново переписывать.
Для ускорения поиска можно иметь индексы на нужные поля, формат примерно такой: поле индекса, номер записи в базе.
Здесь открывается огромный простор для творчества как сортировать, как хранить индексы их перезаписывать и т.д. и т.п.
В таблицах можно первую строку использовать как заголовок файла и там описывать поля (название, тип, длина и пр.).
Некоторые могут сказать, а нафига.
Ну во первых это интересно, пускай народ не обижается но класс программирование в VB в основном зависит от того кто сколько литературы и Help_ов поимел, чем дальше залазишь в дебри классов, свойств и методов тем грустнее становиться. К тому-же это катострофически пожирает ресурсы, а с 128 метрами памяти по моему нет особого труда открыть тот же индекс на 10000 записей в памяти и не мучить винт. И к тому-же ты не зависишь от лицензий.
Я недавно видел в одной организации 286-й на нем кадровая задачка на С, чудно работает.
На вопрос, че компьютер не замените, ответ а на фига.
Работает, что надо делает в игрушки не играют и даже последние вирусы его не трогают.

Ну я чето расфилосовствовался, это не к добру, ну давай дерзай.
[/img]

cg_ck
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 11.06.2003 (Ср) 12:02
Откуда: Riga(Latvia)

Сообщение cg_ck » 06.08.2003 (Ср) 17:38

Спасибо за пример, я для себя нашёл несколько другое решение.
Идея помечать поля как удалённые действительно не плохая, но до поры до времени. Через определённый промежуток времени большая чать базы состояла бы именно из таких полей. Решение окозалось невероятно простым. Я дописал ещё одну функцию впрограмме, которую назвал отладчиком. Её можно запускать время от времени, промежуток выбирает ползователь(день, два, неделя...). Она переписыват файл(полностью), но только без строк, которые были помечены как удалённые. Работает быстро и со временем, я думаю сэкономит некоторое место на харде и естественно отразится н производительности прграммы.
Тема закрыта.
Ходит по лесу хомяк, хищный маленький дурак...

ПЕТР
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 23.07.2003 (Ср) 6:25
Откуда: г. Братск

Сообщение ПЕТР » 07.08.2003 (Чт) 2:24

Я просто забыл упомянуть, что не обязательно записывать на место удаленной записи, можно писать в конец файла и иногда его перезаписывать без удаленных.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 6

    TopList