Когда Len ошибается... Или проблемы работы с файлом :(

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

Когда Len ошибается... Или проблемы работы с файлом :(

Сообщение 0xy » 17.06.2006 (Сб) 22:51

Код: Выделить всё
Private Type Test1
    a As Byte
    b() As String * 160
End Type
.
Private Sub K8_Click()
    Dim T As Test1
    ReDim T.b(1 To 6)
    Debug.Print Len(T) ' == 5 байт  :shock:  :D
End Sub

Знаю, что этот баг документирован как "фитча" :) Но чё делать то?

Да, задача максимум: сохранить эту беду в файл в качестве ЗАПИСИ (т.е. файл состоит из множества таких записей).
И было бы совсем круто ее оттудова потом прочесть ;)

PS
Процедура, само собой, демонстративная: на практике размерность .b() каждый раз разная.
Последний раз редактировалось 0xy 18.06.2006 (Вс) 3:40, всего редактировалось 2 раз(а).

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.06.2006 (Сб) 23:00

LenB?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.06.2006 (Сб) 23:23

Нет, не LenB.

Но мне непонятно, зачем 0xy для сохранения записи в файл знать её длину. VB сам сдвигает указатель на нужное место.
Изображение

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 18.06.2006 (Вс) 3:36

tyomitch писал(а): мне непонятно, зачем 0xy для сохранения записи в файл знать её длину.

Ну, я пытаюсь работать в Random с Put/Get, и если указать недостаточную длину -- будет ошибка.
С записями постоянной длины проблем не было. А тут -- не пойму, как вообще действовать :evil: Ладно, проблему с Len пока обошел раком:
Код: Выделить всё
RecordLen=Len(T)-2+(160+8)*UBound(T.b)

Писать теперь получается. А вот как потом прочесть это? Т.е. откуда мне знать длину каждой записи :?: Самому чтоли сохранять?

Можете ли предложить более цивилизованое решение?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.06.2006 (Вс) 4:41

Указание длины записи применяется, когда длина постоянная.
Когда длина непостоянная, длина записи не применяется.
Вот, собственно, и всё.
As Binary.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Сообщение 0xy » 18.06.2006 (Вс) 5:58

А как потом читать этот Binary? Просто начать с начала файла, и Basic сам определит длину первой записи, прочтет ее и поставит указатель на начало второй?

И, как я понимаю, начать чтение с произвольной записи невозможно?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.06.2006 (Вс) 11:54

0xy писал(а):А как потом читать этот Binary? Просто начать с начала файла, и Basic сам определит длину первой записи, прочтет ее и поставит указатель на начало второй?

Угу.

0xy писал(а):И, как я понимаю, начать чтение с произвольной записи невозможно?

Ну так если формат такой кривой?
Изображение

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 9:37

Может проблема в том, что ты смотришь длину "T", количество записей которого равно 5 элементам, а надо смотреть длину T.b.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.07.2006 (Вт) 10:40

0xy писал(а):И, как я понимаю, начать чтение с произвольной записи невозможно?


Записей много будет?
Если мало, то проще использовать INI-файл.
Если много, то MDB. И не мучиться...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение Viper » 18.07.2006 (Вт) 10:48

XPAHuTEJIb писал(а):Может проблема в том, что ты смотришь длину "T", количество записей которого равно 5 элементам, а надо смотреть длину T.b.


Бред... сам то пробовал?

Собственно по сабжу - Len в данном случае считает так: 1 байт для Byte и 4 байта для указателя на массив. LenB делает тоже самое, но учитывает выравнивание, поэтому выдаст результат 8 байт.
Весь мир матрица, а мы в нем потоки байтов!

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 12:03

а не бред ли искать длину фиксированой записи?

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

Сообщение Viper » 18.07.2006 (Вт) 12:17

XPAHuTEJIb писал(а):а не бред ли искать длину фиксированой записи?


Гм... Ты вопрос то прочитал? Длина записей у автора различна. Посему автору совет записывать в файл длину записываемого массива для каждой записи. Естественно придется делать запись и чтение в режиме Binary.

З.Ы. Глянул на даты... Опять некрофилия? И опять пост с мягко говоря неверным советом?
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2006 (Вт) 13:14

!Viper! писал(а):Собственно по сабжу - Len в данном случае считает так: 1 байт для Byte и 4 байта для указателя на массив. LenB делает тоже самое, но учитывает выравнивание, поэтому выдаст результат 8 байт.

Нет, не так. Len считает длину в символах, LenB -- в байтах.
В одном символе два байта; а выравнивание не при чём.
Изображение

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

Сообщение Viper » 18.07.2006 (Вт) 13:59

tyomitch писал(а):Нет, не так. Len считает длину в символах, LenB -- в байтах.
В одном символе два байта; а выравнивание не при чём.
это верно для строк, но не в данном случае.
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2006 (Вт) 14:26

Да, действительно :-(
Изображение

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 14:37

!Viper!
3 раза перечитал. Я прав, ты нет. Длина записи фиксирована, что доказывает пример и слова автора: "...файл состоит из множества таких записей"

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 18.07.2006 (Вт) 14:41

XPAHuTEJIb писал(а):3 раза перечитал.
Выходит, что три раза для тебя маловато будет :(
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

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

Re: Когда Len ошибается... Или проблемы работы с файлом :(

Сообщение Viper » 18.07.2006 (Вт) 14:42

0xy писал(а):
PS
Процедура, само собой, демонстративная: на практике размерность .b() каждый раз разная.


так длина фиксированная или как?
Весь мир матрица, а мы в нем потоки байтов!

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 16:02

vvs_adm, !Viper! у каждого более тысячи постов, а разницы между размерностью массива (в данном случае T.b()) и длиной так и не поняли :)

в данном случае длина вычисляется как:
for t=1 to ubound(t.b)
s=s+len(t.b(t))
next t
s=s+len(a) 'ну или 1

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.07.2006 (Вт) 18:24

XPAHuTEJIb, строка по-твоему где сохраняется? не в файле? в тонком воздухе, что ли?
Изображение


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

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

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

    TopList