主题:当读取到一个字符时,则将这一行所有程序全删除
hahaixix23
[专家分:0] 发布于 2007-10-15 17:10:00
请问一个问题,DELPHI语言的程序,实现的功能是:当读取到一个字符时,则将这一行所有程序全删除。例
将:
GOTO / -50.00000, -10.00000
why/ 0.00100
GOTO / -20.00000, -10.00000
where/ 0.00000
转换成:
GOTO / -50.00000, -10.00000
GOTO / -20.00000, -10.00000
(当读到why时将所在行全删除,当读到where时将所在行全删除)
回复列表 (共19个回复)
沙发
angwuy [专家分:2280] 发布于 2007-10-15 18:32:00
f1,f2:textfile;//文件操作,f1为读入,f2为输出
st:string;
begin
...//初始化工作
while not eof(f1) do
begin
readln(f1,st);
if (copy(st,1,3)<>why)and(copy(st,1,5)<>where) then
writeln(f2,st);
end;
end;
板凳
hahaixix23 [专家分:0] 发布于 2007-10-15 20:59:00
好像不太对吧
3 楼
angwuy [专家分:2280] 发布于 2007-10-16 18:49:00
题目不太清楚:
要不要处理每行前的空格?
关键字是否出现在每行前面?
关键字是否分大小写?
4 楼
长尾兔 [专家分:3630] 发布于 2007-10-16 21:41:00
问题描述的确不清。“当读取到一个字符时,则将这一行所有程序全删除。”----从哪里读取?是字符还是字符串?将这一行“程序”删除?
下面假设你是从TXT文本文件里读取,只要某一行有'why'或'where'这两个字符串之一,此行文本就删除,然后保存到原TXT文件中。用TStringList轻易实现(并不是说仅仅TStringList这一种方法)
procedure TForm1.Button1Click(Sender: TObject);
const
Target1 : string = 'why';
Target2 : string = 'where';
fName : string = 'c:\test.txt';
var
SS : TStringList;
I : integer;
begin
SS := TStringList.Create;
SS.LoadFromFile(fName);
for I := SS.Count-1 downto 0 do
if (Pos(Target1, SS[I]) > 0) or (Pos(Target2, SS[I]) > 0) then
SS.Delete(I);
SS.SaveToFile(fName);
end;
另外,不要向个人资料里那个cool@163.com信箱写信,那个信箱是我随便写的,不是我的。幸亏你给我站内短信了,要不然你会以为我不热情.......
5 楼
长尾兔 [专家分:3630] 发布于 2007-10-16 21:45:00
写得急了,上面的代码最后少了一句:
SS.Free;
---------------------------
如果你的文本来源是一个TMemo,或者RichEdit之类的,这样:
procedure TForm1.Button2Click(Sender: TObject);
const
Target1 : string = 'why';
Target2 : string = 'where';
var
SS : TStringList;
I : integer;
begin
SS := TStringList.Create;
SS.Assign(Memo1.Lines);
for I := SS.Count-1 downto 0 do
if (Pos(Target1, SS[I]) > 0) or (Pos(Target2, SS[I]) > 0) then
SS.Delete(I);
Memo1.Lines.Assign(SS);
SS.Free;
end;
6 楼
hahaixix23 [专家分:0] 发布于 2007-10-17 08:46:00
不好意思,应该是我的问题问的不清楚,意思就是:打开一个TXT文件,并使它在MEMO文框中显示,再逐行读取文件,每行都从行头开始,当在行头读取到一段特殊字符时,就将行头拥有此字符的行整行删除!
我先试试长尾兔大哥的好不好用,谢谢了
[em2]
7 楼
hahaixix23 [专家分:0] 发布于 2007-10-17 08:47:00
不好意思,应该是我的问题问的不清楚,意思就是:打开一个TXT文件,并使它在MEMO文框中显示,再逐行读取文件,每行都从行头开始,当在行头读取到一段特殊字符时(不分大小写,行头绝对没有空格,一开始就出现特殊字符),就将行头拥有此字符的行整行删除!
8 楼
hahaixix23 [专家分:0] 发布于 2007-10-17 09:00:00
试了,挺好用,就是这样功能,谢谢大哥,你是姓李吧?
9 楼
长尾兔 [专家分:3630] 发布于 2007-10-17 09:33:00
其实是同样一个道理。
无非就是利用TStringList类以及Copy、Pos等函数而已
Memo1.Lines 恰恰就TStrings类,而TStringList也是TStrings类的派生类
const
Target1 : string = 'why';
Target2 : string = 'where';
fName : string = 'c:\test.txt';
var
I : integer;
begin
Memo1.Lines.LoadFromFile(fName);//从TXT读到Memo1
for I := Memo1.Lines.Count-1 downto 0 do
if (Copy(Memo1.Lines[I], 1, Length(Target1)) = Target1)
or (Copy(Memo1.Lines[I], 1, Length(Target2)) = Target2) then
Memo1.Lines.Delete(I);
Memo1.Lines.SaveToFile(fName); //再把处理后的结果存为TXT文件
end;
10 楼
长尾兔 [专家分:3630] 发布于 2007-10-17 09:37:00
是姓李。
问题描述清楚前,我给你的代码,是某行一旦有关键字符串,则整行删除;
问题描述清楚后,上面的代码,是从字符串的开始位置发现关键子串,则整行删除。
其实你理解一下Copy、Pos、Length这些函数就会明白。这些函数会经常用到的。
我来回复