51 lines
1.7 KiB
QBasic
51 lines
1.7 KiB
QBasic
|
DEFLNG A-Z ' Default variable type is long integer.
|
||
|
LINE INPUT "File to search: ", FileName$
|
||
|
LINE INPUT "Pattern to search for: ", Pattern$
|
||
|
OPEN FileName$ FOR BINARY AS #1
|
||
|
|
||
|
CONST PACKETSIZE = 10000, TRUE = -1
|
||
|
PatternLength% = LEN(Pattern$)
|
||
|
FileLength = LOF(1)
|
||
|
BytesLeft = FileLength
|
||
|
FileOffset = 0
|
||
|
|
||
|
' Keep searching as long as there are enough bytes left in
|
||
|
' the file to contain the pattern you're searching for:
|
||
|
DO WHILE BytesLeft > PatternLength%
|
||
|
|
||
|
' Read either 10,000 bytes or the number of bytes left in the file,
|
||
|
' whichever is smaller, then store them in Buffer$. (If the number
|
||
|
' of bytes left is less than PACKETSIZE, the following statement
|
||
|
' still reads just the remaining bytes, since binary I/O doesn't
|
||
|
' give "read past end" errors):
|
||
|
Buffer$ = INPUT$(PACKETSIZE, #1)
|
||
|
|
||
|
' Find every occurrence of the pattern in Buffer$:
|
||
|
Start% = 1
|
||
|
DO
|
||
|
StringPos% = INSTR(Start%, Buffer$, Pattern$)
|
||
|
IF StringPos% > 0 THEN
|
||
|
|
||
|
' Found the pattern, so print the byte position in the file
|
||
|
' where the pattern starts:
|
||
|
PRINT "Found pattern at byte number";
|
||
|
PRINT FileOffset + StringPos%
|
||
|
Start% = StringPos% + 1
|
||
|
FoundIt% = TRUE
|
||
|
END IF
|
||
|
LOOP WHILE StringPos% > 0
|
||
|
|
||
|
' Find the byte position where the next I/O operation would take place,
|
||
|
' then back up the file pointer a distance equal to the length of the
|
||
|
' pattern (in case the pattern straddles a 10,000-byte boundary):
|
||
|
FileOffset = SEEK(1) - PatternLength%
|
||
|
SEEK #1, FileOffset + 1
|
||
|
|
||
|
BytesLeft = FileLength - FileOffset
|
||
|
LOOP
|
||
|
|
||
|
CLOSE #1
|
||
|
|
||
|
IF NOT FoundIt% THEN PRINT "Pattern not found."
|
||
|
|