Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохраняем в двоичный файл, или любой другой с возможностью ячеек 
:(
    Опции темы
DenageS
Дата 18.2.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 29.9.2006

Репутация: нет
Всего: нет



Здравствуйте.
Мне нужно сохранить в файл массив.
Я это делал это в цикле сохранением каждого индекса массива в "ячейку" файла произвольно доступа. (Простите за терминологию). Тип данных - число.
Вот как я это делал. 

Код

Dim IDX2 As Long
Private cpX() As Long 'Массив Аргумент
...

Open Text2.Text For Random As #1
    For IDX = 1 To last_idx ' last_idx - последний индекс
        DoEvents
        Put #1, IDX, cpX(IDX)
    Next
Close #1


Сначала целью было - лиж бы работало, но теперь мне надо решить проблему - слишком большой объем файлов. Я попытался сохранять так же, изменив  Random на Binary. 
При этом размер файла уменьшился примерно в 100 раз.
Но открывать таким способом мне не удалось.

А именно я стал экспериментировать

Код

Dim b As long
Dim c As long
Dim e As long
b = Text1.Text
c = Text3.Text
e = Text5
Open "C:\wer\1.dat" For Binary As #1
Put #1, 1, b

Put #1, 2, c

Put #1, 3, e
Close #1

Но тогда при чтении

Код

Dim a As Single
Dim d As Single
Dim f As Single
Open "C:\wer\1.dat" For Binary As #1
Get #1, 1, a
Get #1, 2, d
Get #1, 3, f
Close #1
Text2.Text = a
Text4.Text = d
Text6 = f
End Sub

Неизменной оставалась лишь последняя запись.

Тогда я методом щупа нашел, что если указать НЕ As Single, а As Byte, тогда все отлично работает, но присваиваться может лишь маленькое число, а например 1024 вызывает переполнение.

В общем подскажите мне как сохранить массив с меньшим объемом файла, или же как обычное 4-х значное число перевести в As byte
PM MAIL ICQ   Вверх
cardinal
Дата 18.2.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(DenageS @  18.2.2007,  12:17 Найти цитируемый пост)
или же как обычное 4-х значное число перевести в As byte 

1 байт - диапазон значений 0 - 0xFF (0 - 255)
2 байта - диапазон значений 0 - 0xFFFF (0 - 65535)

То есть для числа 1024 тебе надо два байта (прочитать в данном случае то есть надо два байта из файла). Число получишь так: Старший байт * 256 (читай сдвиг влево на 8) + Младший байт.

А еще посмотри тут
http://vingrad.ru/VB-VB-001960


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Akina
Дата 19.2.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Так какого типа массив надо сохранять? именно Long?

Новый проект. 2 кнопки с именами Command1 и Command2. В модуль формы - вот такого типа код:

Код

Option Explicit

Private Sub Command1_Click()
Dim i As Long
Dim x(1 To 3) As Long
x(1) = 1
x(2) = 2222
x(3) = 333333333
Open "\1.txt" For Random As #1 Len = 4
For i = 1 To 3
   Put #1, i, x(i)
Next
Close #1
End Sub

Private Sub Command2_Click()
Dim i As Long
Dim x(1 To 3) As Long
Open "\1.txt" For Random As #1 Len = 4
Do
   i = InputBox("Index (1 to 3) ?")
   If Abs(i - 2) < 2 Then
      Get #1, i, x(i)
      MsgBox x(i)
   End If
Loop Until i = 0
Close #1
End Sub

Развлекайся.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 19.2.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



Цитата(DenageS @  18.2.2007,  14:17 Найти цитируемый пост)
если указать НЕ As Single, а As Byte,
В твоей схеме Put-Get сохраняют каждый раз один байт, поэтому чИсла длинее одного байта искажаются. Вероятно, за счет этого у тебя и уменьшился так сильно объем файла - потому что из многих байтов чисел записывались только по одному от каждого.
Потому что в операторе Open у тебя не указана "длина записи" - а по умолчанию она 1 байт. Нужно указать такую длину записи, сколько байт требует используемый тобою тип чисел.

(Не знаю, как в VB, а в досовском бейсике еще надо было число сперва передавать в специальную "файловую" переменную, задаваемую в операторе Field, а уж из нее - в файл (при этом типе доступа).)

Добавлено @ 11:01 
Цитата(DenageS @  18.2.2007,  14:17 Найти цитируемый пост)
как обычное 4-х значное число перевести в As byte
это так же невозможно, как 4 цифры записать в трех клеточках. Количество цифр - оно и увеличивается при помощи добавления числу байтов. В одном байте (byte) помещается максимум 255.
 


Это сообщение отредактировал(а) JusTalionis - 19.2.2007, 10:54
PM MAIL   Вверх
daNick
Дата 20.2.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 12.8.2006
Где: Казахстан, Астана

Репутация: нет
Всего: нет



А можно ли в VB организовать упаковнный тип данных, как в паскале? прямо в файле?
--------------------
Долго не кончать - преимущество мужчины, а не оратора.Я так много читал о вреде курения, что решил бросить... читать.(с) Сергей Довлатов
PM MAIL ICQ   Вверх
Black_Star
Дата 1.3.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



Цитата(JusTalionis @  19.2.2007,  10:47 Найти цитируемый пост)
Потому что в операторе Open у тебя не указана "длина записи" - а по умолчанию она 1 байт

А мне кажется, что Random по умолчанию делает размер 50 байт.
И вообще для сохранения массива не стоит делать цикл! Это изврат. Достаточно просто написать.
Код

open "c:\bla_bla.txt" for binary as #1
put #1,adr,cpX
close #1

adr - адрес начала данных в файле.
Единственный минус. При загрузке необходимо знать размер массива. Т.е. сразу надо сделать ReDim, а потом
Код

get #1,adr,cpX

Размер можно хранить в том же файле...
Запись:
Код

MaxArr=Ubound(cpX)
MinArr=Lbound(cpX)
put #1,adr,MinArr
put #1,adr+4,MaxArr
put #1,adr+8,cpX

Чтение:
Код

get #1,adr,MinArr
get #1,adr+4,MaxArr
ReDim cpX(MinArr to MaxArr)
get #1,adr+8,cpX



Цитата(daNick @  20.2.2007,  11:57 Найти цитируемый пост)
А можно ли в VB организовать упаковнный тип данных, как в паскале? прямо в файле? 


Что есть упакованный тип данных?
PM ICQ   Вверх
Akina
Дата 1.3.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(Black_Star @  1.3.2007,  11:56 Найти цитируемый пост)
мне кажется, что Random по умолчанию делает размер 50 байт.

Это неверно. Вообще при указании типа доступа For Random обязательно следует указывать размер буфера (Len=). Если он не указан, то размер буфера устанавливается в 128 байт.

Следует помнить, что первые 2 байта записи содержат длину содержащейся в данной записи информации.

 




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Black_Star
Дата 2.3.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



Цитата(Akina @  1.3.2007,  19:30 Найти цитируемый пост)
Если он не указан, то размер буфера устанавливается в 128 байт.

Тем более!
PM ICQ   Вверх
Akina
Дата 2.3.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(Black_Star @  2.3.2007,  10:50 Найти цитируемый пост)
Тем более! 

Ни фига не "тем более". Размер буфера не имеет никакого отношения к размеру записи.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Black_Star
Дата 2.3.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



Цитата(Akina @  1.3.2007,  19:30 Найти цитируемый пост)
Вообще при указании типа доступа For Random обязательно следует указывать размер буфера (Len=). Если он не указан, то размер буфера устанавливается в 128 байт.


Цитата(Akina @  2.3.2007,  11:20 Найти цитируемый пост)
Ни фига не "тем более". Размер буфера не имеет никакого отношения к размеру записи. 


 smile Думать много вредно! Думать надо постоянно!  smile 
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.