dos_compilers/Microsoft QuickBASIC v45/EXAMPLES/SEARCH.BAS

51 lines
1.7 KiB
QBasic
Raw Normal View History

2024-07-02 06:19:24 +02:00
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."