Массив данных в файл и обратно?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hobit
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 01.06.2007 (Пт) 14:34

Массив данных в файл и обратно?

Сообщение hobit » 23.11.2008 (Вс) 5:33

Добрый день. Есть набор данных в массиве, он записывается в файл, и потом данные считываются.
То что сделал, работает но медленно, помогите ускорить.

И еще, как поступить, чтобы записать все данные из этих 4 массивов в один файл
(сейчас каждый массив в свой файл) и потом восстановить из файла?

Код: Выделить всё
Private Type tVal1
    Val1 As Double
    Val2 As Double
    Val3 As Double
End Type

Private Type tVal2
    Val1 As Long
    Val2 As Long
    Val3 As Long
End Type

Private dVal1() As Double
Private dVal2() As Double
Private arVal1() As tVal1
Private arVal2() As tVal2

‘Сохранение
Dim i As Long
Dim iFF As Long

iFF = FreeFile()
Open NewName1 For Output As #iFF
    For i = 0 To UBound(dVal1())
        Print #iFF, dVal1(i)
    Next i
Close #iFF
iFF = FreeFile()
Open NewName2 For Output As #iFF
    For i = 0 To UBound(dVal2())
        Print #iFF, dVal2(i)
    Next i
Close #iFF
iFF = FreeFile()
Open NewName3 For Output As #iFF
    For i = 0 To UBound(arVal1())
        Print #iFF, Trim$(arVal1(i).Val1) & ";" & Trim$(arVal1(i).Val2) & ";" & Trim$(arVal1(i).Val3)
    Next i
Close #iFF
iFF = FreeFile()
Open NewName4 For Output As #iFF
    For i = 0 To UBound(arVal2())
        Print #iFF, Trim$(arVal2(i).Val1) & ";" & Trim$(arVal2(i).Val2) & ";" & Trim$(arVal2(i).Val3)
    Next i
Close #iFF



‘Чтение
Dim i As Long, l As Long
Dim iFF As Long
Dim sTempLine() As String
Dim vTempArray As Variant

i = 0
iFF = FreeFile()
Open NewName1 For Input As #iFF
    Do While Not EOF(iFF)
        ReDim Preserve sTempLine(i)
        Line Input #iFF, sTempLine(i)
        i = i + 1
    Loop
Close #iFF
l = UBound(sTempLine)
ReDim dVal1(0 To l)
For i = 0 To l
    dVal1(i) = CDbl(sTempLine(i))
Next i

Erase sTempLine()
i = 0
iFF = FreeFile()
Open NewName2 For Input As #iFF
    Do While Not EOF(iFF)
        ReDim Preserve sTempLine(i)
        Line Input #iFF, sTempLine(i)
        i = i + 1
    Loop
Close #iFF
l = UBound(sTempLine)
ReDim dVal2(0 To l)
For i = 0 To l
    dVal2(i) = CDbl(sTempLine(i))
Next i

Erase sTempLine()
i = 0
iFF = FreeFile()
Open NewName3 For Input As #iFF
    Do While Not EOF(iFF)
        ReDim Preserve sTempLine(i)
        Line Input #iFF, sTempLine(i)
        i = i + 1
    Loop
Close #iFF
l = UBound(sTempLine)
ReDim arVal1(0 To l)
For i = 0 To l
    If Len(Trim$(sTempLine(i))) > 0 Then
        vTempArray = Split(Trim$(sTempLine(i)), ";", , vbBinaryCompare)
        arVal1(i).Val1 = CLng(vTempArray(0))
        arVal1(i).Val2 = CLng(vTempArray(1))
        arVal1(i).Val3 = CLng(vTempArray(2))
    End If
Next i

Erase sTempLine()
i = 0
iFF = FreeFile()
Open NewName4 For Input As #iFF
    Do While Not EOF(iFF)
        ReDim Preserve sTempLine(i)
        Line Input #iFF, sTempLine(i)
        i = i + 1
    Loop
Close #iFF
l = UBound(sTempLine)
ReDim arVal2(0 To l)
For i = 0 To l
    If Len(Trim$(sTempLine(i))) > 0 Then
        vTempArray = Split(Trim$(sTempLine(i)), ";", , vbBinaryCompare)
        arVal2(i).Val1 = CDbl(vTempArray(0))
        arVal2(i).Val2 = CDbl(vTempArray(1))
        arVal2(i).Val3 = CDbl(vTempArray(2))
    End If
Next i

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Массив данных в файл и обратно?

Сообщение Mikle » 23.11.2008 (Вс) 11:13

Открывай файл, как Binary, отправляй массивы туда целиком:
Код: Выделить всё
Put #nf,adr,m()
Так же читай.

hobit
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 01.06.2007 (Пт) 14:34

Re: Массив данных в файл и обратно?

Сообщение hobit » 23.11.2008 (Вс) 11:24

Сохранить, как binary массивы получилось, а вот восстановить их нет

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Массив данных в файл и обратно?

Сообщение Mikle » 23.11.2008 (Вс) 11:40

Делай массиву перед чтением из файла Redim до такого же размера, как был при сохранении. Если он неизвестен - сначала сохраняй размер, потом массив:
Код: Выделить всё
mSize=ubound(m)
put#nf,,mSize
put#nf,,m
Соответственно читай:
Код: Выделить всё
Get#nf,,mSize
ReDim m(mSize)
Get#nf,, m()

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Массив данных в файл и обратно?

Сообщение iGrok » 23.11.2008 (Вс) 12:10

Mikle писал(а):Делай массиву перед чтением из файла Redim до такого же размера, как был при сохранении. Если он неизвестен - сначала сохраняй размер, потом массив:

Есть второй вариант. Проще в реализации, но занимает больше места в файле.
Объявить
Код: Выделить всё
Private Type ArrStore
    dVal1() As Double
    dVal2() As Double
    arVal1() As tVal1
    arVal2() As tVal2   
End Type
Private Store as ArrStore

'Сохранить:
Put #nf,,Store

'Загрузить:
Get #nf,,Store

При этом работать с массивами через этот тип. (Store.dVal1(...))
label:
cli
jmp label

hobit
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 01.06.2007 (Пт) 14:34

Re: Массив данных в файл и обратно?

Сообщение hobit » 23.11.2008 (Вс) 13:31

Mikle, очередное тебе спасибки :alien: :D
iGrok, спасибо, в начале я так и делал, но ступив переделал в первый вариант (вверху), сейчас сделал как Mikle советовал, размер моих дампов уменьшился почти в 3 раза (с 150 метров до 60)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Массив данных в файл и обратно?

Сообщение iGrok » 23.11.2008 (Вс) 14:21

hobit писал(а):Mikle, очередное тебе спасибки :alien: :D
iGrok, спасибо, в начале я так и делал, но ступив переделал в первый вариант (вверху), сейчас сделал как Mikle советовал, размер моих дампов уменьшился почти в 3 раза (с 150 метров до 60)

Ну я и говорю, написать проще, но места занимает больше. =)
По способу, указанному Mikle, ты пишешь только данные, плюс размеры массивов. Это, строго говоря, правильнее. Ибо ничего лишнего. )
А в моём варианте пишется ещё дофига служебной инфы.. Хотя чё-то я всё равно не верю, что там вместо 60 метров дампится 150.. Там инфы-то лишней - 10 байт на массив.. Если не особо ошибаюсь, это заголовок SAFEARRAY.
label:
cli
jmp label

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Массив данных в файл и обратно?

Сообщение Mikle » 23.11.2008 (Вс) 16:40

iGrok
В первом варианте вообще писались в массив строки вместо Double :lol:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Массив данных в файл и обратно?

Сообщение iGrok » 23.11.2008 (Вс) 17:44

Mikle писал(а):iGrok
В первом варианте вообще писались в массив строки вместо Double :lol:

А, ну если 150 метров - это про то, что в первом посте написано, тогда верю =)))
label:
cli
jmp label


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

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

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

    TopList  
cron