Dll для побайтового чтения из файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Dll для побайтового чтения из файла

Сообщение ALX_2002 » 07.01.2005 (Пт) 21:23

Челы.... Сейчас я буду позориться....

Мне нужна ваша хелпа...

не могу написать простейшую DLL. Прошу у вас помощи :( :(

Функции

1) Открывает файл для Binary чтения

2) Чтение из файла с параметром (SIZE)

При каждом обращении смещается по файлу. Когда файл

кончается возвращает - ""

3) Закрывает файл

:( Помогите плиз. Совсем синтаксис забыл... :(
Последний раз редактировалось ALX_2002 12.01.2005 (Ср) 19:43, всего редактировалось 1 раз.

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 07.01.2005 (Пт) 21:59

Извини, тебе нужна именно DLL на Basic?
Короче так: тебе нужен объект, который скрывает функции для работы с файлом или бинарник с кодом функции, которую ты хочешь вызывать? Если второе - пиши на C++, юзай fstream.
Если все-таки первое:
Код: Выделить всё
open fileName for Binary Access Read (Write) Lock (Read) Write as FileNumber

1.
Do while not EOF(FileNumber)
Get FileNumber, ByteNumber, MyByte
'еще вариант чтения: MyString=Input(NumberOfBytes, FileNumber)
Loop

2.
For ByteNumber=1 to LOF(FileNumber)
Get FileNumber, ByteNumber, MyByte
Next ByteNumber


и т.п.
Cвободный FileNumber, если хочешь открывать несколько файлов, лучше всего получить так:
Код: Выделить всё
FileNumber=FreeFile


Еще способ: подключи библиотеку Microsoft Scripting Runtime и посмотри в Object Browser про FileSystemObject
Последний раз редактировалось Eugenio 07.01.2005 (Пт) 22:18, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.01.2005 (Пт) 22:02

Моежт ПОБАЙТОВОЕ чтение из файла? Побитового не бывавет...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 07.01.2005 (Пт) 22:07

Побитовое бывает, и иногда полезно - например, для тех же GIF-ов. Но у ALX_2002 имхо именно побайтовое.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 07.01.2005 (Пт) 22:08

2 ANDLL: Я в двойне опозорен :D

2 Eugenio: В кратце - мне нужно сделать DLL, к которой можно будет

обратиться из ASP.

При использовании FSO возникла проблема одновременного чтения из файла :(

Я думал, что при "open fileName for Binary Access Read" 2

пользователя, подключившиеся к ASP смогут чиать файл.

P.s Спасибо за код - пойду пробывать :)

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 07.01.2005 (Пт) 22:15

ALX_2002 писал(а):В кратце - мне нужно сделать DLL, к которой можно будет

обратиться из ASP.


ActiveX DLL, короче, с объектами, которые будут создаваться - на стороне сервера, да? ИМХО, с asp'ом лучше все-таки FSO юзать. Открывай файл ForReading

При использовании FSO возникла проблема одновременного чтения из файла :(

Я думал, что при "open fileName for Binary Access Read" 2

пользователя, подключившиеся к ASP смогут чиать файл.

Смогут.
Есть ли у меня вопрос? У меня всегда есть вопрос

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.01.2005 (Пт) 22:23

tyomitch писал(а):Побитовое бывает, и иногда полезно - например, для тех же GIF-ов. Но у ALX_2002 имхо именно побайтовое.

Продемонстрируй-ка код, считывающий бит № 158 из файла text1.txt :shock:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 07.01.2005 (Пт) 22:26

ANDLL писал(а): Продемонстрируй-ка код, считывающий бит "158 из файла text1.txt :lol:

Считывается GIF'ы конечно тоже побайтово, но ALX_2002'а могли же, теоретически, интересовать побитовые операции :)
Есть ли у меня вопрос? У меня всегда есть вопрос

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 07.01.2005 (Пт) 22:39

Новая проблема возникла. Мне нужно получить реальный размер файла

File.Size - возращает размер на диске, а мне нужен реальный размер файла...

Никак не могу придумать через что в ASP его получить :(

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

Сообщение tyomitch » 07.01.2005 (Пт) 23:32

ANDLL писал(а):
tyomitch писал(а):Побитовое бывает, и иногда полезно - например, для тех же GIF-ов. Но у ALX_2002 имхо именно побайтовое.

Продемонстрируй-ка код, считывающий бит № 158 из файла text1.txt :shock:

Код: Выделить всё
Public Function GetBit(ByVal bn As Long) As Boolean
Dim b As Byte
Get #1, 1 + (bn \ 8), b
GetBit = b And (2 ^ (bn Mod 8))
End Function

В реальном коде, конечно, последний считанный байт запоминается, а не пересчитывается 8 раз.
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.01.2005 (Сб) 0:24

Удивительно, как только я произношу кодовое слово ASP, тут же в пост перестают писать :D :D :D

Это закономерность такая ?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 08.01.2005 (Сб) 9:07

ALX_2002 писал(а):Удивительно, как только я произношу кодовое слово ASP, тут же в пост перестают писать :D :D :D

Это закономерность такая ?

Да. Мало кто его знает, по ходу.
tyomitch писал(а):
ANDLL писал(а):
tyomitch писал(а):Побитовое бывает, и иногда полезно - например, для тех же GIF-ов. Но у ALX_2002 имхо именно побайтовое.

Продемонстрируй-ка код, считывающий бит № 158 из файла text1.txt :shock:

Код: Выделить всё
Public Function GetBit(ByVal bn As Long) As Boolean
Dim b As Byte
Get #1, 1 + (bn \ 8), b
GetBit = b And (2 ^ (bn Mod 8))
End Function

В реальном коде, конечно, последний считанный байт запоминается, а не пересчитывается 8 раз.

Ну, Темыч, это побайтовое чтение из файла...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.01.2005 (Сб) 12:39

Вы чего хотите то ? Читать файл как 000111001111011 ?

Если я ничего не путаю, то по идее ADODB.Stream возвращает файлы

в таком виде ? Или нет ?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 08.01.2005 (Сб) 13:16

По большому счету наш с tiomitch'ем спор исключительно номенклатурный - никакого отношения к рассматриваему вопросу и к прикладному программированию он не имеет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение GSerg » 08.01.2005 (Сб) 13:20

Минимальной адресуемой единицей является байт. Не прите против архитектуры :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 08.01.2005 (Сб) 19:52

ANDLL писал(а):Ну, Темыч, это побайтовое чтение из файла...

Пользователь этой длл-ки, однако, этого не знает. С его точки зрения, чтение идёт побитно.
Речь идёт об "инкапсуляции" "особенностей архитектуры" PC в удобную для использования структуру (поток битов).

А как это реализовано внутри длл-ки - пользователя не волнует. Хоть телепатически прямо магнитные домены прямо с блина винта считывает, до пользователя доходят только биты.

Спор не номенклатурный, спор как раз прикладной :-)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 19:59

Народ... Я задрался с этим GET , INPUT , RANDOM..... ужас

Помогите плиз :cry:

Мне нужно написать функцию

Код: Выделить всё
Function ReadFile(BYTES)

End Function


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

Т.е

Код: Выделить всё
Do
Bits=ReadFile(100)
Loop Until Bits=""


Я замучался

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.01.2005 (Вс) 20:25

Попробуй:
Код: Выделить всё
Private Sub Form_Load()
MsgBox RF(1)
End Sub

Public Function RF(ByVal nBytes As Long) As String
Static nCurPos As Long, fNum As Long, nFileSize As Long
If fNum = 0 Then
    fNum = FreeFile
    Open "C:\file.txt" For Binary Access Read As #fNum
    nCurPos = 1
End If
If nCurPos > LOF(fNum) Then
    RF = ""
    Close #fNum
    fNum = 0
    Exit Function
End If
Dim nStr As String
nStr = Space(nBytes)
Get #fNum, nCurPos, nStr
nCurPos = nCurPos + nBytes
RF = nStr
End Function
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 20:28

Ух... Вроде пошло.... ПАСИБА !!! :D

Ещё 1 вопр. При чтении через FSO.OpenTextStream

Как строку переводить в двоичные данные ? :?: :roll:

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.01.2005 (Вс) 20:57

А не как. Строка это и есть двоичные данные. Или тебя интересует массив байтов?

Код: Выделить всё
dim A as string,B() as Byte
A="ABC"
B=A
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 09.01.2005 (Вс) 20:59

ANDLL писал(а):Попробуй:
Код: Выделить всё
Private Sub Form_Load()
MsgBox RF(1)
End Sub

Public Function RF(ByVal nBytes As Long) As String
Static nCurPos As Long, fNum As Long, nFileSize As Long
If fNum = 0 Then
    fNum = FreeFile
    Open "C:\file.txt" For Binary Access Read As #fNum
    nCurPos = 1
End If
If nCurPos > LOF(fNum) Then
    RF = ""
    Close #fNum
    fNum = 0
    Exit Function
End If
Dim nStr As String
nStr = Space(nBytes)
Get #fNum, nCurPos, nStr
nCurPos = nCurPos + nBytes
RF = nStr
End Function

Способ короче:
Код: Выделить всё
Private Sub Form_Load()
MsgBox RF(1)
End Sub

Public Function RF(ByVal nBytes As Long) As String
Static fNum As Long
If fNum = 0 Then
    fNum = FreeFile
    Open "C:\file.txt" For Binary Access Read As #fNum
End If
If EOF(fNum) Then
    RF = ""
    Close #fNum
    fNum = 0
Else
    RF = Space(nBytes)
    Get #fNum, , RF
End If
End Function

Сравни длину ;-)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 21:12

http://www.activeserverpages.ru/articles/read.asp?id=25

2 ANDLL - Я прочёл, что FSO не может нормально читать двоичные данные. Она портит символы переноса строки.

Я нашёл код, который передаёт картинку,
BinArray = BinArray & chrB(asc(a.Read(1)))

И хотел узнать - можно ли просто в прочитанной строке заменять эти 2

символа на то что нужно, а не читать таким [censored]ым

методом ? :shock:

2 Tyomitch: Хм.... Чем меньше код, тем понятнее.... Пасиба.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.01.2005 (Вс) 21:30

tyomitch писал(а):
ANDLL писал(а):Попробуй:
Код: Выделить всё
...

Способ короче:
Код: Выделить всё
...

Сравни длину ;-)

А я не знал, что get сам смещает позицию в файле :shock:
2ALX_2002: никогда с FSO не работал на таком уровне. Зачем?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.01.2005 (Вс) 21:32

Еще: бредова идея, но:
Код: Выделить всё
dim A as string,B() as Byte
A="ABC"
B=strconv(A,vbFromUnicode)

Впрочем, идея, как я сказал бредовая :)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 09.01.2005 (Вс) 21:54

Облом.... При этом всё равно надо делать цикл перебора всей строки.....эх... :evil:

Пилохо

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

Сообщение tyomitch » 09.01.2005 (Вс) 22:06

ALX_2002, а чем тебя не устраивает наша с ANDLL "Dll для побайтового чтения из файла"? Или надо именно через FSO?
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 10.01.2005 (Пн) 13:07

1) Просто с FSO было бы проще в плане написания кода... но тормозит..

2) Трабл... ваш код не до конца файл читает. Из-за того что длина файла произвольная, а делим его равными кусками, лезут глюки

последний кусок не читается :(

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 10.01.2005 (Пн) 21:16

Прочитал, что при Random эта ошибка исчезает

Облом... Терь говорит размер буфера не подхдит... :(

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

Сообщение tyomitch » 11.01.2005 (Вт) 5:07

ALX_2002 писал(а):2) Трабл... ваш код не до конца файл читает. Из-за того что длина файла произвольная, а делим его равными кусками, лезут глюки
Попробуй такой код:
Код: Выделить всё
Private Sub Form_Load()
MsgBox RF(1)
End Sub

Public Function RF(ByVal nBytes As Long) As String
Static fNum As Long
If fNum = 0 Then
    fNum = FreeFile
    Open "C:\file.txt" For Binary Access Read As #fNum
End If
If EOF(fNum) Then
    RF = ""
    Close #fNum
    fNum = 0
Else
    If nBytes > (LOF(1) - Seek(1)) Then nBytes = (LOF(1) - Seek(1))
    RF = Space(nBytes)
    Get #fNum, , RF
End If
End Function
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 11.01.2005 (Вт) 13:05

Зачем все эти мучения, не пойму.. LOF() - Seek() юзать неверно, потому что Seek() возвратит следующую, еще нечитанную позицию. Например: длина файла (LOF) - 10b, хотим читать его по 5b:
1-й вызов: LOF - Seek() = 9, читаем с 1-го по 5-й
2-й вызов: LOF - Seek() = 4, читаем с 6-го по 9-й :)


Надо вроде вот этого:
Код: Выделить всё
Public Function RF(ByVal nBytes As Long,ResStr As String) As Boolean
Static fNum As Long

RF = False: ResStr = ""

If fNum = 0 Then
    fNum = FreeFile
    Open "C:\file.txt" For Binary Access Read As #fNum
End If

If EOF(fNum) Then
    Close #fNum
    fNum = 0
Else
  If Loc(fNum) + nBytes > LOF(fNum) then
    nBytes = LOF(fNum) - Loc(fNum)
  EndIf

  ResStr = Space(nBytes)
  Get #fNum, , ResStr

  RF = True
End If
End Function


Код: Выделить всё
Do While RF(BytesNumber,Str)
    .......
Loop

Во, так, пожалуй, нормально
Есть ли у меня вопрос? У меня всегда есть вопрос

След.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 158

    TopList