|
|
|
| Open "Temp" for Binary Acces Write S #1
Write #1, 12
Close #1
выдает ошибку bad file mode? | |
|
| |
|
|
|
| используйте функцию Put() | |
|
| |
|
|
|
| используйте функцию Put() | |
|
| |
|
|
|
| Open "Temp" For Binary AS #1
Put #1, , 12 'Только это инструция, а не функция.
И где у вас массив? Может опишите задачу подробнее? | |
|
| |
|
|
|
| Массив в таблице. В процедуре открывается таблица как RecordSet.
Эти данные нужно отправить в бинари файл с переносом строки или без.
Пробовал организовать цикл, результат непонятен.
Как проверить в файле запись, записано или нет ? | |
|
| |
|
|
|
|
Как проверить в файле запись, записано или нет ?
|
Функция LOF(1) возвращает размер открытого файла. После записи первого массива это значение равно значению св-ва FieldSize поля MEMO или OLE Object, а в дальнейшем - сумме значений этого св-ва.
Но как потом вы определите, где в файле конец обного массива и начало другого? Ведь комбинация "перевод строки" может присутствовать внутри массива.
Какова конечная цель?
ИМХО, нужно для каждого поля в таблице создавать свой файл, либо делать так, как это принято в dBase, FoxPro и т.д. | |
|
| |
|
|
|
| В файл нужно записать 10 чисел в цикле.
Как организовать этот цикл записи?
Put в цикле с переводом строки и без. | |
|
| |
|
|
|
| Может вот поизучаете?
Вопрос: Запись/считывание файлов в/из таблицы
Совет:
Я использую следующий код для считывания/записи файлов.
Краткое пояснение: 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
|
| |
|
| |
|
|
|
| И вот ещё мнимножко
Это не по теме , но натолкнуть может........
Вопрос: Работа с файлами средствами 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
|
| |
|
| |
|
|
|
| Основная задача.
Есть wav файл, в котором нужно подменить массив для воспроизведения заданной кривой.
1. Как заменить, либо создать, а потом вставить в каком-нибудь редакторе? | |
|
| |
|
|
|
| Т.е. в существующем файле надо заменить один фрагмент другим, зная его размер и с какой позиции он начинается?
Put #1, i, bytArr
Эта инструкция заменяет или добавляет определенное количество байтов (сколько их присутствует в массиве), начиная с позиции, указанной в переменной i. | |
|
| |
|
|
|
| Спасибо за помощь!
Как в Put #1, ... подставить массив? | |
|
| |
|
|
|
|
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 отдельных чисел.
Что и как у вас хранится в таблице? | |
|
| |
|
|
|
| Проясняется, спасибо.
Для полной ясности:
Задача сгенерить звуковой зондирующий файл , заданный опеделенной функцией.
Например в Excele.
Сгенерил в звуковом редакторе файл нужной длины и битрейта и теперь задача заменить его данные на данные Excelа .
Я нашел в wav файле, рассматривая HEX-редактором, где начинаются и кончаются данные файла. Это 2х байтовое слово, в котором старший бит отвечает за знак.
С заменой Вы всё прояснили, спасибо.
Но как вводить адрес 1-го числа, если в HEX-редакторе оно номер строки 00000020 и
младший байт столбец E, а старший F ? | |
|
| |
|
|
|
| Это значит, что в стоке 20 находятся байты с HEX адресами от 20 до 2F (начиная с 0).
В свою очередь в VBA преобразование выполняется так (в окне отладки):
?&H20
32
?Hex(32)
20
В вашем случае инструкцию можно написать так:
Put #1, &H2E+1, Число1 | |
|
| |
|
|
|
| Спасибо.
Запись массива заработала.
Не работают :
1. отрицательные числа, что с ними делать
2. массив 2хбайтный знаковый | |
|
| |
|
|
|
| Забудьте про массив. Если инструкции Put передать переменную Long, то запишется 4 байта, а если Integer, то 2.
Т.е. достаточно сделать так:
Dim i As Integer
i = 12
Put #1,&H2E+1, i
|
Или еще проще:
Put #1,&H2E+1, CInt(12) | |
|
| |
|
|
|
| 1.значению массива я присваивал целые числа (int)
Как только появляются целые отрицательные числа в массиве , ошибка №6 Overflow (при заполнении массива)
2. до значения +255 -255 массив работает, а у нас 15-разрядное число со знаком , максимальное и минимальное число в массиве +32768 -32768, | |
|
| |