Хранение кусков RTF-Текста в файле

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

Хранение кусков RTF-Текста в файле

Сообщение Albert » 09.02.2006 (Чт) 22:43

Смысл такой:
Мне нужно открыть моей программулиной (на vb6) текстовый файл имеющий следующую структуру:

Flag
RTF-текст...
............
............
Flag
RTF-текст...
............
............
Flag
RTF-текст...
............
............

***


Нужно программно считать эти куски RTF-текста и поместить в Строковый массив (Для последующего вывода их на экран, щелкая нужную кнопку)!
Внимание вопрос: Как быстрее это сделать??
Так как куски RTF-текста могут быть большими, то при построчном чтении файла на это уходит много времени!
Может вначале все считать в переменную, а потом резать, не знаю!

Может вообще попытаться как то по другому организовать хранение??? У кого какие идеи???

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.02.2006 (Чт) 23:03

построчно пробегать.
Либо хранить в бинарных структурах(что рекомендую)
Типа
Type A
RTFs() as String
end Type
и считывать\записывать Put\Get'ом.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 8:22

Я построчно и читаю, только при открытии (или сохранении) такого файла на это уходит много времени (Например файл 400к открывается примерно 4 сек).
Считываю и записываю я при этом Line Input и Print.
Если пользоваться Put/Get это будет быстрее????

И еще! Чтобы хранить в бинарных структурах, файл надо сначало считать и разбить на элементы массива, а в этом вся и проблема!

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 10:26

Да, и еще, если создавать файл произвольного доступа, то записи в нем должны по длине быть одинаковыми! А у меня куски RTFтекста могут быть разной длины!!! Или я не прав??? Подскажите выход!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.02.2006 (Пт) 11:50

Записи могут быть произвольной длины, ведь каждый следующий кусок RTF-кода отмечается флагом.

Лучше сразу читать весь файл в одну большую строковую переменную или массив байт, потом резать на куски вручную. На форуме были обсуждения вариантов переброса массива байт в String, ищите.

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 11:56

Т.е. быстрее способа нет, как всё считать в строковую переменную и потом, уже просматривая ее, вытаскивать эти куски текста между флагами??? Может вообще, какой нибудь, в принципе, другой подход использовать???

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.02.2006 (Пт) 12:09

А чем такой способ не быстр?

Читать надо не построчно, а одним махом.
Затем InStr'ом ищем флаг (очередной RTF-кусок) и mid$'ом вытаскиваем его.

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 12:27

Смысл я понял!
А если файл большой (несколько мегабайт)??? ЕГо содержимое влезит в String?????

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 10.02.2006 (Пт) 12:54

если памяти у компа хватит, то влезит :lol:

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 15:31

Реализовал вышепредложенное! Блин... скорость практически не изменилась

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.02.2006 (Пт) 15:36

Код в студию. Иначе по сути дела ничего сказать и поправить не сможем.

Какая была скорость раньше, и насколько изменилась?

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 16:01

Массив MasBVO As String!

Код: Выделить всё


sFile = "Имя_файла"
 
  'Считываем весь файл
  intFH = FreeFile()
  Open sFile For Input As intFH
    strFileAll = Input$(LOF(intFH), intFH)
  Close intFH  'Закрытие файла
  MasStrFileAll = Split(strFileAll, vbCrLf)

'Определение кол-ва "кусков" 
  NQA = 0
  For i = 3 To UBound(MasStrFileAll) - 1
    st = Crypt(MasStrFileAll(i), i + 1)  'Дешифровка строки
    If (Mid(st, 1, 5)="Parnt")Or(Mid(st, 1, 5)="Child") Then
       NQA = NQA + 1
    End If   
  Next i

'Заполнение массива
ReDim MasBVO(NQA)

Num = 0
  For i = 0 To UBound(MasStrFileAll) - 1   
    Select Case Mid(st, 1, 5)
      Case "Parnt" 'Считан родитель
           Num = Num + 1
           MasBVO(Num) = MasStrFileAll(i)
      Case "Child" 'Считан потомок
           Num = Num + 1
           MasBVO(Num) = MasStrFileAll(i)     
      Case Else 'если продолжение на следующей строке
           MasBVO(Num) = MasBVO(Num) & vbCrLf & MasStrFileAll(i) '<= это и тормозит
    End Select
  Next i

'Массив MasStrFileAll индексируется с 0 (Split'ом)
'Массив MasBVO с 1

'Массив MasStrFileAll вспомагательный! Важно заполнить массив MAsBVO

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 17:13

Ну так что???? Впринципе всё в памяти делаю! Весь файл один раз считал и всё! А всё равно скорость маленькая! Как быстрее???

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.02.2006 (Пт) 17:34

Незачем разбивать файл на строки.
Предлагаю по-другому.

1) читаем файл в строку

'Считываем весь файл
intFH = FreeFile()
Open sFile For Input As intFH
strFileAll = Input$(LOF(intFH), intFH)
Close intFH 'Закрытие файла

2) в цикле InStr'ом ищем два соседних Flag'а. То, что между ними - нужный RTF-код, который и записываем в strRTF(i).

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.02.2006 (Пт) 17:41

Ну вот так примерно

Код: Выделить всё
Option Explicit

Private Sub Form_Load()
Dim stext As String, flag As String
Dim strRTF() As String

Dim i As Long, j As Long, k As Long
flag = "FLAG"
stext = "FLAGfgetregfmkFLAGfeterfFLAG"

i = InStr(1, stext, flag)
Do
    j = InStr(i + 1, stext, flag)
    If j > 0 Then
        ReDim Preserve strRTF(k)
        strRTF(k) = Mid$(stext, i + Len(flag), j - i - Len(flag))
        k = k + 1
    Else
        Exit Do
    End If
    i = j
Loop

MsgBox strRTF(0) & vbCrLf & strRTF(1)
End Sub


Только одно НО. В моем коде нужно, чтобы файл заканчивался на FLAG. Переправить - минута :)

Albert
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 09.02.2006 (Чт) 22:39
Откуда: Москва

Сообщение Albert » 10.02.2006 (Пт) 17:45

Сейчас попробую! Только у меня флаги двух типов!

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 11.02.2006 (Сб) 7:58

А что мешает считать весь файл в память в строковую переменную strTxt, а потом через Split преобразовать текст в массив используя в качестве разделителя флаги? Имхо так будет намного быстрее, чем через Mid.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList