回 帖 发 新 帖 刷新版面

主题:从文件中搜索关键字(修改后重发)

1. 根据内存空间动态处理数据块
2. 为方便操纵append文件,改由从文件末起搜索

s1&:  上一个位置
f$:   文件名
a$:   目标关键字

FUNCTION seach$ (s1&, f$, a$)
ddlong& = FRE(" ") \ 2 - 20
IF ddlong& > 32767 THEN ddlong& = 32767
La& = LEN(a$)
fl& = ddlong& - La& + 1
if fl&<1 then
  print "内存严重不足"
  exit function
endif
fr% = FREEFILE
OPEN f$ FOR BINARY AS #fr%
s0& = s1&             '加入长文件从后面起找的顺序
s1& = 0
ddlong2& = ddlong&
IF s0& = 0 THEN s0& = LOF(fr%)
DO
  s$ = ""              '目的是减少空间占用
  s0& = s0& - fl&
  IF s0& < 1 THEN
     ddlong2& = ddlong2& + s0& - 1
     s0& = 1
  END IF
  SEEK #fr%, s0&
  s$ = INPUT$(ddlong2&, fr%)
  s2& = INSTR(s$, a$)
  IF s2& > 0 THEN
   DO UNTIL INSTR(s2& + 1, s$, a$) = 0
      s2& = INSTR(s2& + 1, s$, a$)
   LOOP
   s1& = s0& + s2& - 1
   SEEK #fr%, s1&
   s$ = ""
   s$ = INPUT$(ddlong&, fr%)
   s2& = INSTR(s$, CHR$(13) + CHR$(10))
   IF s2& > 0 THEN s$ = LEFT$(s$, s2& - 1)
   seach$ = s$
   s$ = ""
   EXIT DO
  END IF
LOOP UNTIL s0& = 1
CLOSE #fr%
END FUNCTION

回复列表 (共4个回复)

沙发

sub replace (f$, a$, b$) '把文件f$中的字符a$替换成b$
ddlong& = FRE(" ") \ 2 - 20
IF ddlong& > 32767 THEN ddlong& = 32767
La& = LEN(a$)
fl& = ddlong& - La& + 1
if fl&<1 then
  print "内存严重不足"
  exit sub
endif

fr% = FREEFILE
OPEN f$ FOR BINARY AS #fr%
s0& = 1
s1& = 0
DO until eof(fr%)
  s$ = ""              '目的是减少空间占用
  SEEK #fr%, s0&
  s$ = INPUT$(ddlong&, fr%)
   DO
      s2& = INSTR(s2& + 1, s$, a$)
      if s2&>0 then
         seek #fr%,s0&+s2&-1
         put #fr%,,b$
      end if
   LOOP UNTIL s2& = 0
   s0& = s0& + fl&
LOOP
CLOSE #fr%
END sub

板凳

1.请你注意一下变量的命名,太短了,代码长了就不知是做什么的,难记
2.打开文件时先检查一下文件是否有存在,否则会产生一个空文件(垃圾)
3.不要老是用DO...LOOP这个语句,太单调了
4.缩进的空格多一点,这样层次就比较清晰
5.减少字符串的变量缓冲长度,在字符串比较时,运行速度和字符串长度有关

3 楼

1. 只要你不把过程或函数定义为共享或静态空间,
   变量命名短些便于编写和识别,减少出错的机会

2. 在现在的电脑里,垃圾文件再多也能放得下,
   等你看不顺眼的时候再整理也不晚,
   真要检查随便加几句上去就可以了.
   当然,这个时候得看你用的BASIC的版本了
   如果是7.1,可以用dir$
   如果是4.5,可以用lof,为空文件时再kill

3. 我只听说做程序的时候要注意空间问题,时间问题,效率问题,结构问题
   可单调的问题没怎么听说过啊.

4. 我拇指有点累,抱歉抱歉

5. 定长字符串占用空间比较多,
   使用变长字符串时会比较灵活,
   不用的时候把它置空就能把空间放出来了.
   在这里, 字符缓冲的速度比文件缓冲的速度快.

6. 我是有点死不认错的意思,还在"死鸡撑饭盖"的强词夺理,
   做人就得有不认错的精神,哈哈.

4 楼

'Moz这个过程是个很好的过程,相信很多人都会用到的
'我大胆地改了一下(没有测试),Moz不要见怪

sub ReplaceFileText (FileName$, TextStr$, AimStr$)
'=================================================
'  把文件FileName$中的字符TextStr$替换成AimStr$
'=================================================
on local error goto WriteFileError
Num%=freefile
open FileName$ as #Num%
if lof(Num%)=0 then
    close Num%
    kill FileName$
    print "无此文件或文件没有内容"
    exit sub
endif
close Num%

if TextStr$="" or AimStr$="" then exit sub

QBMemory& = FRE(" ") \ 2 - 20     '取QB可用剩余内存
IF QBMemory& > 32767 THEN QBMemory& = 32767

                                  '取缓冲长度
BufLengh& = QBMemory& - LEN(TextStr$) + 1
if BufLengh&<1 then               '内存不足
   print "内存严重不足"
   exit sub
endif

FileNum% = FREEFILE               '打开文件
OPEN f$ FOR BINARY AS #FileNum%
TextIndex& = 1
's1& = 0    <==你的s1&变量没有用到

while not eof(FileNum%)           '不好意思,改成while...wend语句
   Buf$ = ""                      '目的是减少空间占用
   SEEK #FileNum%, TextIndex&
   Buf$ = INPUT$(QBMemory&, FileNum%)
   DO
       Found& = INSTR(Found& + 1, Buf$, TextStr$)
       if Found&>0 then
           seek #FileNum%,TextIndex&+Found&-1
           put #FileNum%,,AimStr$
       end if
   LOOP UNTIL Found& = 0
   TextIndex& = TextIndex& + BufLengh&
wend

CLOSE #FileNum%

exit sub
WriteFileError:
    select case err
        case 57
             print "对不起,无法完成替换,当前不充许写入"
        case else
             '发生其他问题错误时代码,在测试时候加上
    end select
    exit sub
    resume
return
END sub

我来回复

您尚未登录,请登录后再回复。点此登录或注册