Запись структуры в файл

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Jyx
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 01.12.2006 (Пт) 6:52

Запись структуры в файл

Сообщение Jyx » 01.12.2006 (Пт) 7:08

Помогите, плз.

Создана структура вида

Structure NameStruct
dim myi()as integer
End structute

VB ругается если указать фиксированный размер массива, а если оставлять как есть не получается узнать размер структуры для записи в файл с произвольным доступом. VB6 с этим проблем не было, на VB.NET не получается.

PS:Данные в массив передаются фиксированные, и отладчик показывает их длинну.

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

Сообщение Viper » 01.12.2006 (Пт) 8:29

Размер массива легко получить через свойство Length
Весь мир матрица, а мы в нем потоки байтов!

Jyx
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 01.12.2006 (Пт) 6:52

Сообщение Jyx » 01.12.2006 (Пт) 9:46

Согласен, только мне нужен рамер структуры.
Сама структура сложнее приведенной выше, посчитать размер ее легко ручками, но только VB не хочет принемать посчитаную цифру в качестве размера записи для fileput.
А сделать запись типа len(MyStruct) как в VB6 не получается - выдает ошибку "Не верная длинна записи".

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

Сообщение Viper » 01.12.2006 (Пт) 10:33

Зачем тебе fileput? Давай рассказывай, что собственно творишь
Весь мир матрица, а мы в нем потоки байтов!

Jyx
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 01.12.2006 (Пт) 6:52

Сообщение Jyx » 01.12.2006 (Пт) 10:54

Есть структура состоящая из нескольких массивов integer и byte которая представляет собой зашифрованую учетную запись пользователя. Задача сохранить несколько учетных записей в одном файле. Структура здесь нужна чтоб логически объеденить поля профиля: ИД, Логин, Имя, Пароль, Примечания, и пр. служебную информацию.

Собственно загвозка как раз в том, что VB6 я делал так:
Type NameStruct
ID as integer
Name(20) as integer 'зашифрованая строка
Login(20) as integer 'зашифрованая строка
...
End Type
Все работало, длинну структуры(пользовательского типа) можно было получить как Len(NameStruct1)

В VB.NET 2005 сделал так:
Structure NameStruct
dim ID as integer
dim Name() as integer
dim Login() as integer
^ здесь VB.NET не дает прописать фикс массив, ругается
...
End structure

Затем в массивы находящиеся в структуре передаю массив с фиксированной длинной например (20), здесь все нормально отладчик правильно показывает размер массива находящегося в структуре. А затем мне нужно записать эту зашифрованую учетную запись в файл - соответственно я его открываю для произвольного доступа и записываю, но получаю ошибку о длине записи структуры.

Отсюда вижу два выхода либо каким-то образом получить размер структуры, либо искать другие варианты реализации.

Если у кого есть такие мысли, поделитесь плз.
PS: показать реальный код не могу, исходники у меня дома.

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

Сообщение Viper » 01.12.2006 (Пт) 11:06

и какой смысл делать аналог методов VB6 в VB.NET?

Создавай BinaryWriter для записи и BinaryReader для чтения и используй их методы для записи отдельных элементов структуры, в том числе и массивов...

З.Ы. В структуру можно даже добавить методы записи и чтения для полной капсуляции...
Весь мир матрица, а мы в нем потоки байтов!

Jyx
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 01.12.2006 (Пт) 6:52

Сообщение Jyx » 01.12.2006 (Пт) 12:32

То есть, каждый елемент записывать, считывать отдельно? А если мне понадобится получить учетную запись №3, выше указанные метод позволит ее получить не обращаясь к первым трем? Просто есть еще одна структура которая должна примерно содержать 500000 записей, если мне например понадобится запись №34523 то прийдется потратит время на загрузку первыз 34522 записей?

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

Сообщение Viper » 01.12.2006 (Пт) 12:45

У тебя размер структуры всегда пстоянен? Если так, то ты можешь установить позицию файла в нужное место и считать нужную запись, как впрочем и записать, если же длина непостоянна, то не судьба... до нужного места придется идти последовательно считывая все записи
Весь мир матрица, а мы в нем потоки байтов!

Jyx
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 01.12.2006 (Пт) 6:52

Сообщение Jyx » 01.12.2006 (Пт) 12:56

В принципе я для этого структуру и хотел использовать чтоб получить постоянную длинну записи + логически объедененную.

Спасибо за подсказку, вечерком попробую разобратся.


Вернуться в Visual Basic .NET

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

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

    TopList