Страница: 1 |
Страница: 1 |
Вопрос: Binary Reading
Добавлено: 23.09.05 19:19
Автор вопроса: Amor | ICQ: 1268198
Как прочитать binary файл до опроделённого символа или даже строки с последующей перезаписью файла с добавления новой инфы
пример:
файл "GIF98axxxxxxxx,yyyyy;" вот мне надо заменить ",yyyyy;"
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 23.09.05 21:27
dim str as string, tstr as string
str = "yyyyy"
nf = freefile()
open filename for binary read write access as nf
for i = 1 to lof(nf) - len(str) step len(str)
tstr = space(len(str))
get nf, i, tstr
if tstr = str then
put nf, i, "hello"
end if
next
close nf
Номер ответа: 2
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #2
Добавлено: 23.09.05 23:45
sne, приведённый алгоритм не подойдёт, ибо не учитывает вариант, когда искомая строка находится на стыке буферов чтения.
Amor, не ясно, будут ли заменяемая и заменяющая строки одинаковой длины. от этого зависит сложность алгоритма.
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 27.09.05 11:38
ИМХО, если файл не особо большой - считать его в строку (если большой - поэтапно, с кешированием границ). Найти через InStr свою строку, и заменить её. Кроме того, придется лишний раз открыть и закрыть файл на Output, т.к. если новая строка окажется короче старой - в файле будет лишний мусор.
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 27.09.05 21:30
2el-paso, каких буферов... я что-то не догнал чуть чуть )
А вообще step убрать - и все будет великолепно
Номер ответа: 5
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #5
Добавлено: 27.09.05 22:31
О, да... Без него всё будет прекрасно... Если файл не слишком большой.
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 28.09.05 07:10
Тебе нужно не прочитать до определённой позиции, а считывать заголовки.
Например ты можешь использовать такую структуру (писал сам, так что может несовпасть с официальной):
Signature As String * 3
Version As String * 3
End Type
Type LogicalDescriptor
Width As Integer
Height As Integer
BitFields As Byte
BackColor As Byte
Scale As Byte
End Type
Type GlobalInfo
Header As MainHeader
 escriptor As LogicalDescriptor
End Type
Private MainInfo As GlobalInfo
Ну и считываешь запись MainInfo из файла по начальной позиции.
Ну а работать с ней можно например так
Select Case MainInfo.Header.Signature
Case "GIF"
Select Case MainInfo.Header.Version
Case "87a", "89a"
GifInfo = MainInfo.Header.Version
Case Else
GifInfo = "Unknown"
End Select
Case Else
Exit Function
End Select
End Function
Это для примера, а ты просто меняешь нужные поля записи MainInfo и пишешь эту структуру обратно в файл.