Random чтение файла

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

Random чтение файла

Сообщение Fridx » 20.01.2006 (Пт) 21:11

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

Открываю файл методом Random.
В модуле пользовательский тип данных, в котором несколько переменных.
Читаю данные циклом:

Private Sub Pokaz()
Dim X As Byte
On Error Resume Next
For X = 0 To 1
Get #2, X + Start, Blok
Text2(X) = RTrim(Blok.xx)
Text3(X) = RTrim(Blok.yy)
Text4(X) = RTrim(Blok.zz)
Next X
On Error GoTo 0
End Sub

Спасибо!

JWST
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 07.01.2006 (Сб) 21:05

Сообщение JWST » 20.01.2006 (Пт) 22:00

Может быть это не поможет, но я решал подобную проблему так:
Код: Выделить всё
text$ = "1234567890"
MsgBox text$   'выведет 1234567890
text$ = Mid(text$, 2) ' т.е. значение начиная с двух (а начало было ноль! Помни это!)
MsgBox text$   'выведет 34567890

Мне помогло это именно так. Только я таким методом выцыплял уникод и убирал его. Реализацию можешь посмотреть здесь: http://bbs.vbstreets.ru/viewtopic.php?t=22666

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Random чтение файла

Сообщение Viper » 21.01.2006 (Сб) 7:33

Fridx писал(а):
Код: Выделить всё
Private Sub Pokaz()
Dim X As Byte
On Error Resume Next
For X = 0 To 1
Get #2, X + Start, Blok
Text2(X) = RTrim(Blok.xx)
Text3(X) = RTrim(Blok.yy)
Text4(X) = RTrim(Blok.zz)
Next X
On Error GoTo 0
End Sub



вдумаемся, что же происходит в данном коде:

1. Объявляется переменная-счетчик X (почему то типа Byte)
2. Дважды из файла нумер 2 читаются записи в переменную Blok (похоже это структура, но какая мы не знаем) с номерами Start и Start+1. Поскольку чему равно Start мы тоже не знаем, то с какой позиции это все читается тоже не понятно

Судя по всему это не помогло решить проблему

Если телепатически предположить, что Start это те самые ненужные байты, то может стоит попользоваться функцией Seek, чтобы поставить туда указатель чтения, а уж потом осуществить чтение нужного количества БАЙТОВ, которые потом преобразовать в нужные структуры
Весь мир матрица, а мы в нем потоки байтов!

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 21.01.2006 (Сб) 23:03

Private Sub Pokaz()

Get #2, Start, Blok
Text2(X) = RTrim(Blok.xx)
Text3(X) = RTrim(Blok.yy)
Text4(X) = RTrim(Blok.zz)

End Sub

В идеале всё вот так выглядит. Извините за первоначальную

На счёт seek:
указатель перемещается, но не на кол-во байтов, а на кол-во моих секторов.

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 22.01.2006 (Вс) 10:52

Ты же читаешь блоками, размером с твой тип, поэтому и шаг в цикле должен быть равен не 1, а размеру твоего типа:

Private Sub Pokaz()
Dim X As Integer
On Error Resume Next
For X = 0 To 1
Get #2, X*Len(Твой тип) + Start, Blok
Text2(X) = RTrim(Blok.xx)
Text3(X) = RTrim(Blok.yy)
Text4(X) = RTrim(Blok.zz)
Next X
On Error GoTo 0
End Sub
Нет ничего невозможного для человека с интеллектом.

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 22.01.2006 (Вс) 11:03

А зачем умножать то?? - X*Len(Твой тип) :shock:
И есть ли разница X*Len(Твой тип) + Start или Start + X*Len(Твой тип)?

-----------------
Кстати между делом:
Как вывести в текстовое поле (например) путь к файлу, который будет открыт? Просто в поиске искал, но безрезультатно. :oops:

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 22.01.2006 (Вс) 11:06

X*Len(Твой тип) нужен для того чтобы ты шагал по файлу шагами, равными длине твоего типа. А от перемены мест слогаемых сумма не меняется - 1 класс :)

По поводу второго вопроса: Text1.Text=FileName :)
Нет ничего невозможного для человека с интеллектом.

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 22.01.2006 (Вс) 13:19

Блин... всё равно непонятно :? .
Вот небольшой пример прикрепил.
там что-то типа базы - baz.txt создал.
Занёс данные. Всё работает нормально. Но вот если добавить пару байтов в начало этой базы, то ясное дело, что в текстовых полях данные будут отображаться со сдвигом-коряво. Как вот этого избежать?? Может на примере поможете?
Вложения
primer.zip
Пример самой простой базы данных.
(1.79 Кб) Скачиваний: 17

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 23.01.2006 (Пн) 11:52

Держи. Я убрал кое-что лишнее, оставил только перменную x. Другие не нужны. Остальное смотри в коде.
Вложения
primer.zip
(2.06 Кб) Скачиваний: 15
Нет ничего невозможного для человека с интеллектом.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 166

    TopList