Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сохранение массива в бинарном виде в файле
 
 автор: никк   (22.02.2009 в 13:23)   личное сообщение
 
 

Open "Temp" for Binary Acces Write S #1
Write #1, 12
Close #1
выдает ошибку bad file mode?

  Ответить  
 
 автор: Дрюня   (22.02.2009 в 14:50)   личное сообщение
 
 

используйте функцию Put()

  Ответить  
 
 автор: Дрюня   (22.02.2009 в 14:52)   личное сообщение
 
 

используйте функцию Put()

  Ответить  
 
 автор: Анатолий (Киев)   (23.02.2009 в 11:11)   личное сообщение
 
 

Open "Temp" For Binary AS #1
Put #1, , 12 'Только это инструция, а не функция.

И где у вас массив? Может опишите задачу подробнее?

  Ответить  
 
 автор: никк   (23.02.2009 в 11:24)   личное сообщение
 
 

Массив в таблице. В процедуре открывается таблица как RecordSet.
Эти данные нужно отправить в бинари файл с переносом строки или без.
Пробовал организовать цикл, результат непонятен.
Как проверить в файле запись, записано или нет ?

  Ответить  
 
 автор: Анатолий (Киев)   (23.02.2009 в 12:40)   личное сообщение
 
 


Как проверить в файле запись, записано или нет ?


Функция LOF(1) возвращает размер открытого файла. После записи первого массива это значение равно значению св-ва FieldSize поля MEMO или OLE Object, а в дальнейшем - сумме значений этого св-ва.
Но как потом вы определите, где в файле конец обного массива и начало другого? Ведь комбинация "перевод строки" может присутствовать внутри массива.

Какова конечная цель?

ИМХО, нужно для каждого поля в таблице создавать свой файл, либо делать так, как это принято в dBase, FoxPro и т.д.

  Ответить  
 
 автор: никк   (23.02.2009 в 12:48)   личное сообщение
 
 

В файл нужно записать 10 чисел в цикле.
Как организовать этот цикл записи?
Put в цикле с переводом строки и без.

  Ответить  
 
 автор: час   (23.02.2009 в 13:10)   личное сообщение
 
 

Может вот поизучаете?

Вопрос: Запись/считывание файлов в/из таблицы

Совет: 
Я использую следующий код для считывания/записи файлов.
Краткое пояснение: tblFiles - таблица, имеющая два поля FileName (текстовое, хотя можно и MEMO) и FileContent - Поле объекта OLE.
В FileName вводится путь к требуемым файлам.
GetDataFromFile - считывание файлов в таблицу
PutDataInFile - запись содержимого полей OLE в файлы
Файлы получаются идентичными.

Public Sub GetDataFromFile()
    Dim bData As String, rs As Recordset
    Set rs = CurrentDb.OpenRecordset("tblFiles")
    With rs
        Do While Not .EOF
            bData = String(FileLen(!filename), " ")
            Open !filename For Binary Access Read As #1
            Get #1, , bData
            Close #1
            .Edit
            !FileContent.AppendChunk bData
            .Update
            .MoveNext
        Loop
    End With
    rs.Close
    Set rs = Nothing
End Sub

Public Sub PutDataInFile()
    Dim bData As String, rs As Recordset
    Dim lngOffset As Long, lngTotalSize As Long
    Const conChunkSize = 32768
    Set rs = CurrentDb.OpenRecordset("tblFiles")
    With rs
        Do While Not .EOF
            bData = ""
            lngOffset = 0
            lngTotalSize = !FileContent.FieldSize
            Do While lngOffset < lngTotalSize
                bData = bData & !FileContent.GetChunk(lngOffset, conChunkSize)
                lngOffset = lngOffset + conChunkSize
            Loop
            Open !filename For Binary Access Write As #1
            Put #1, , bData
            Close #1
            .MoveNext
        Loop
    End With
    rs.Close
    Set rs = Nothing
End Sub

  Ответить  
 
 автор: час   (23.02.2009 в 13:13)   личное сообщение
 
 

И вот ещё мнимножко

Это не по теме , но натолкнуть может........

Вопрос: Работа с файлами средствами VB (Далее приведены 2 готовые функции, читающие текстовый файл в строковую переменную)

Совет: 
Примеры по работе с файлами из среды VB (VBA)

Добавил на сайт: am 08.08.2003

'Чтение бинарного файла в массив байт
Open sFileName For Binary Access Read As #1
    Get #1, , TheBytes()
Close #1

'запись массива байт в файл
Open sFileName For Binary Access Write As #1
    Put #1, , TheBytes()
Close #1

'Построчное чтение текстового файла
iFile = FreeFile
    Open App.Path & "\" & sININame For Input As iFile
        Do While Not EOF(iFile) ' Loop until end of file.
            Line Input #iFile, txt
            'sINI = sINI + txt + vbCrLf
        Loop
    Close iFile

'построчная запись в текстовый файл
    fnum = FreeFile
    file_name = App.Path
    If Right$(file_name, 1) <> "\" _
        Then file_name = file_name & "\"
    file_name = file_name & LOG_FILE_NAME
    Open file_name For Append As #fnum

    ' Remember that the file is open.
    file_open = True

    ' Write the date and time, and the error message.
    Print #fnum, Now
    Print #fnum, "Computer: " & ComputerName
    Print #fnum, txt1
    Print #fnum, "**********"

    ' Close the file.
    Close #fnum

'Далее приведены 2 готовые функции, читающие текстовый файл в строковую переменную.
'первая читает построчно, вторая файл целиком. По быстродействию вторая функция значительно быстрее.
Public Function File2Str(sPath As String) As String
Dim txt As String
Dim sLine As String
Dim fn As Long
fn = FreeFile
    Open sPath For Input As fn
    Do While Not EOF(1)
        Line Input #fn, sLine
        txt = IIf(Len(txt) > 0, txt & vbCrLf, "") & sLine
    Loop
Close fn
File2Str = txt
End Function
'am 030505
Public Function File2StrB(sPath As String) As String
Dim txt As String
Dim sLine As String
Dim fn As Long
fn = FreeFile
Dim TheBytes() As Byte
ReDim TheBytes(FileLen(sPath) - 1)
    Open sPath For Binary Access Read As fn
        Get #fn, , TheBytes()
    Close fn
File2StrB = StrConv(TheBytes(), vbUnicode)
End Function

  Ответить  
 
 автор: никк   (23.02.2009 в 13:30)   личное сообщение
 
 

Основная задача.
Есть wav файл, в котором нужно подменить массив для воспроизведения заданной кривой.
1. Как заменить, либо создать, а потом вставить в каком-нибудь редакторе?

  Ответить  
 
 автор: Анатолий (Киев)   (23.02.2009 в 14:06)   личное сообщение
 
 

Т.е. в существующем файле надо заменить один фрагмент другим, зная его размер и с какой позиции он начинается?
Put #1, i, bytArr
Эта инструкция заменяет или добавляет определенное количество байтов (сколько их присутствует в массиве), начиная с позиции, указанной в переменной i.

  Ответить  
 
 автор: никк   (23.02.2009 в 15:38)   личное сообщение
 
 

Спасибо за помощь!
Как в Put #1, ... подставить массив?

  Ответить  
 
 автор: Анатолий (Киев)   (23.02.2009 в 16:00)   личное сообщение
 
 


Dim bytArr(1 To 10) As Byte
bytArr(1)=Число1
bytArr(2)=Число2
...
bytArr(10)=Число10

Put #1, 3, bytArr 'В файле заменяется 10 байтов, начиная с третьего.


Можно и по другому:

Put #1, 3, CByte(Число1)
Put #1, , CByte(Число2)
...
Put #1, , CByte(Число10)


Вы всё время что-то не договариваете. Спрашиваете, как записать массив в файл, раасказываете, что массив у вас в таблице, а затем уточняете, что это 10 отдельных чисел.
Что и как у вас хранится в таблице?

  Ответить  
 
 автор: никк   (23.02.2009 в 17:28)   личное сообщение
 
 

Проясняется, спасибо.
Для полной ясности:
Задача сгенерить звуковой зондирующий файл , заданный опеделенной функцией.
Например в Excele.
Сгенерил в звуковом редакторе файл нужной длины и битрейта и теперь задача заменить его данные на данные Excelа .
Я нашел в wav файле, рассматривая HEX-редактором, где начинаются и кончаются данные файла. Это 2х байтовое слово, в котором старший бит отвечает за знак.
С заменой Вы всё прояснили, спасибо.
Но как вводить адрес 1-го числа, если в HEX-редакторе оно номер строки 00000020 и
младший байт столбец E, а старший F ?

  Ответить  
 
 автор: Анатолий (Киев)   (23.02.2009 в 17:48)   личное сообщение
 
 

Это значит, что в стоке 20 находятся байты с HEX адресами от 20 до 2F (начиная с 0).
В свою очередь в VBA преобразование выполняется так (в окне отладки):
?&H20
32
?Hex(32)
20

В вашем случае инструкцию можно написать так:
Put #1, &H2E+1, Число1

  Ответить  
 
 автор: никк   (23.02.2009 в 18:05)   личное сообщение
 
 

Спасибо.
Запись массива заработала.
Не работают :
1. отрицательные числа, что с ними делать
2. массив 2хбайтный знаковый

  Ответить  
 
 автор: Анатолий (Киев)   (23.02.2009 в 18:45)   личное сообщение
 
 

Забудьте про массив. Если инструкции Put передать переменную Long, то запишется 4 байта, а если Integer, то 2.
Т.е. достаточно сделать так:

Dim i As Integer
  i = 12
Put #1,&H2E+1, i

Или еще проще:
Put #1,&H2E+1, CInt(12)

  Ответить  
 
 автор: никк   (23.02.2009 в 19:23)   личное сообщение
 
 

1.значению массива я присваивал целые числа (int)
Как только появляются целые отрицательные числа в массиве , ошибка №6 Overflow (при заполнении массива)
2. до значения +255 -255 массив работает, а у нас 15-разрядное число со знаком , максимальное и минимальное число в массиве +32768 -32768,

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList