Dim TextLine As String * 2048
Open "C:\1.exe" For Input As #1
Do While Not EOF(1)
Line Input #1, TextLine
MsgBox TextLine
Loop
Close #1
word = "Inno Setup"
Dim TextLine As String * 2048
Open "C:\1.exe" For Binary As #1
Do While Not EOF(1)
i = i + 1
Get #1, (i * 2048) - Len(word), TextLine
If InStr(1, TextLine, word) > 0 Then MsgBox word
Loop
Close #1
Хакер писал(а):Конечно есть. Абсолютно отсутствует смысл в отнимании Len(word) это раз, и два: если «фраза» окажется на границе двух кусков, то будет облом.
- Len(word)
kuhtiov писал(а):а если файл весит гиг?
kuhtiov писал(а):И что ты скажешь по поводу - Len(word)?
ger_kar писал(а):А можно не парится и реализовать такой алгоритм поиска:
Считываем файл побайтно и сравниваем с кодом первого символа в строке поиска, при совпадении сравниваем со вторым и так далее, при первом обломе если не дошли до конца сравниваемой сроки, делается вывод, что это не тот кусок и продолжаем дальше. Если находит искомый кусок останавливаем поиск. В плане производительности конечно такой алгоритм не очень, зато все очень просто и к тому-же если кусок находится в начале, а я думаю, что в данном случае это так, то и файл до конца читать не надо.
Наоборот, все будет предельно просто и лаконично, а скорость работы в случае если искомый кусок будет находится до середины файла, будет вполне нормальной. Причем, если считывать целиком большой файл в память, а потом его вторично сканировать с целью поиска, да еще если по причине нехватки оперативной памяти, будет активно задействован файл подкачки, то вряд ли такой метод окажется быстрее.kuhtiov писал(а):Это конечно вариант, но получится многастроккода и работать такой алгоритм будет значительно медленнее
ger_kar писал(а):Считываем файл побайтно...
kuhtiov писал(а):А как можно загрузить файл целеком? Ведь будет ошибка, файл та не пару метров.
А мне кстати очень интересно, вон даже Хакер от мой идеи прослезился . Но просто замерять скорость мне не интересно, а интересно именно сравнить, поэтому к вечеру выложу код и жду соответственно кода от kuhtiov, а потом и сравним . Что-бы условия были одинаковыми файл я думаю надо будет брать, такой, который заведомо есть на компе у каждого, ну или создать его, по одному методу. Так что до вечераiGrok писал(а):ger_kar, это при побайтном-то чтении из файла скорость приемлемой будет?! Попробуй на гиговом файле, ради интереса.
ger_kar писал(а):Считываем файл побайтно
ger_kar писал(а):А мне кстати очень интересно, вон даже Хакер от мой идеи прослезился .
kuhtiov писал(а):Мне кажется это сравнимо с перетаскиванием воды из бочки. Или таскать воду ведрами (в данном случаи вообще наперстками) или перенести бочку за раз. Как-то так.
Хакер писал(а):Ты проецируешь файл в виртуальное адресное пространство, при этом весь файл не читается в физическую память. Вообще ни один файл изначально не читается в физическую память. В физическую память будет читаться фрагменты файла, размером кратные размеру страницу (4 кб в общем случае), причём читаться они будут автоматически, по мере необходимости. С какой областью файла сейчас работаешь, те куски автоматически и подгружаются в физ. память, а лишние выгружаются. Какие выгружать и как подгружать определяет ОС на основе своей информации о всей ситуации, и обеспечивает максимальную производительность.
Dim CSharedFileF As New CSharedFile
MsgBox CSharedFileF.CreateFromFile("c:\1.exe", "myfile")
MsgBox CSharedFileF.OpenFileMap("myfile")
MsgBox CSharedFileF.MapOfView
Хакер писал(а):Метод-функция MapOfView возвращает адрес начала файла. Вот ищешь начиная с этого места и до конца минус длина фразы плюс один.
Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 55