Fehler in Pascal-Programmierung ?

Hallo zusammen.
Ich bin das erste Mal hier, und hoffe, da ich schon so viel gutes über dieses Forum gehört habe, dass ihr mir helfen könnt.
Ich habe ein Programm in Pascal geschrieben, das in Unterverzeichnissen und deren Dateien nach bestimmten vierstelligen Zahlencodes sucht, und dann definierte Abschnitte dieser Dateien in eine andere Datei kopiert.
Soviel zur Theorie.
Leider kopiert das Programm alles doppelt in die neue Datei.
Ein Beispiel:
Ich suche nach den Codes 0123 4567 8901.
Dann ist die kopierte Reihenfolge in der neuen Datei:
0123 4567 8901 0123 4567 8910
Und ich hab keine Ahnung wieso.
Bitte helft mir, es ist wirklich dringend!
Danke schonmal im Voraus, Melanie


Der Quellcode:

program suchen;
uses crt,sysutils;

const n=‚aufgabe.tex‘;
var a:text;

{Auslesen der Dateien und schreiben in neue Datei}

procedure lesen(d:string);
var f:text;
c,s:string;
b:boolean;
begin
b:=false;
assignfile(f,d);
{$i-} reset(f);
if ioresult=0 then
begin
while not eof(f) do
begin
readln(f,c);
while length©>0 do
begin
if pos(#10,c)>0
then
begin
s:=copy(c,1,pos(#10,c));
delete(c,1,pos(#10,c));
end
else
begin
s:=copy(c,1,length©);
delete(c,1,length©);
end;
if length(s)>0 then
begin
if (b) and (pos(’\end{hmaufgabe}’,s)=0) then writeln(a,s);
if (((not b) and (pos(paramstr(1),s)>0))
OR ((not b) and (pos(paramstr(2),s)>0))
OR ((not b) and (pos(paramstr(3),s)>0))
OR ((not b) and (pos(paramstr(4),s)>0))
OR ((not b) and (pos(paramstr(5),s)>0))) then
begin
b:=true;
writeln(a,’\item’);
end;
if (pos(’\end{hmaufgabe}’,s)>0) then b:=false;
end;
end;
end;
closefile(f); {$i+}
end;
end;

{Suchen der Labels}

procedure suche(s,t:string);
var r :integer;
p :tsearchrec;
begin

r:=findfirst(s+t,faanyfile,p);
while (r=0) do
begin
if ((p.attr32) and
(p.name[1]’.’)) then suche(s+p.name+’/’,t)
else
begin
if (p.name[1]’.’) and
(extractfileext(p.name)=’.tex’) then lesen(s+p.name);
end;
r:=findnext§;
end;
findclose§;

end;

{Header-Datei kopieren}

procedure dateikopie;
var lesen:string;
var quelle,ziel:text;
const quelldat=‚header.tex‘;
const zieldat=‚aufgabe.tex‘;

begin

assign(quelle,quelldat);
assign(ziel,zieldat);
reset(quelle);
rewrite(ziel);
while not eof(quelle) do begin
readln(quelle,lesen);
writeln(ziel,lesen);
end;

close(quelle);
close(ziel);
end;

{Hauptprogramm}

begin

clrscr;

if paramstr(1)’’ then
begin
dateikopie;

writeln(’> Header-Datei kopiert …’);

assign(a,n);
append(a);
suche(’./’,’*.*’);

writeln(’> Suche im aktuellen Verzeichnis …’);
writeln(’> Elemente werden in „aufgabe.tex“ gespeichert…’);

writeln(a,’\end{enumerate}’);
writeln(a,’\end{document}’);
close(a);
end
else writeln(’> Kein Parameter angegeben!’);

writeln(’> Ende’);
writeln;

end.

Debugen
Hallo,
ohne Dir jetzt konkret zu sagen, woran es liegt
mal folgende Bemerkungen:

  1. Der Quellcode liest sich so wie hier geschrieben
    sehr bescheiden. Mit ordentlicher Formatierung wäre
    es einfacher -> pre - TAG siehe unten

  2. Das Problem, welches Du hast, hat jeder Programmierer
    andauernd. Der Sache kommt man durch „Debugen“ auf die
    Spur. Dazu kannst Du z.B. im Einzelschrittbetrieb
    das Programm abarbeiten und dabei Variablen überwachen
    und auch Testausgaben an geeigneten Stellen machen.
    Das finden der Fehler ist dann überhaupt das wichtigste
    am Programmieren.
    Gruß Uwi

Ich bin das erste Mal hier, und hoffe, da ich schon so viel
gutes über dieses Forum gehört habe, dass ihr mir helfen
könnt.
Ich habe ein Programm in Pascal geschrieben, das in
Unterverzeichnissen und deren Dateien nach bestimmten
vierstelligen Zahlencodes sucht, und dann definierte
Abschnitte dieser Dateien in eine andere Datei kopiert.
Soviel zur Theorie.
Leider kopiert das Programm alles doppelt in die neue Datei.
Ein Beispiel:
Ich suche nach den Codes 0123 4567 8901.
Dann ist die kopierte Reihenfolge in der neuen Datei:
0123 4567 8901 0123 4567 8910
Und ich hab keine Ahnung wieso.
Bitte helft mir, es ist wirklich dringend!
Danke schonmal im Voraus, Melanie


> Der Quellcode:  
>   
> program suchen;  
> uses crt,sysutils;  
>   
> const n='aufgabe.tex';  
> var a:text;  
>   
>   
> {Auslesen der Dateien und schreiben in neue Datei}  
>   
> procedure lesen(d:string);  
> var f:text;  
> c,s:string;  
> b:boolean;  
> begin  
> b:=false;  
> assignfile(f,d);  
> {$i-} reset(f);  
> if ioresult=0 then  
> begin  
> while not eof(f) do  
> begin  
> readln(f,c);  
> while length(c)\>0 do  
> begin  
> if pos(#10,c)\>0  
> then  
> begin  
> s:=copy(c,1,pos(#10,c));  
> delete(c,1,pos(#10,c));  
> end  
> else  
> begin  
> s:=copy(c,1,length(c));  
> delete(c,1,length(c));  
> end;  
> if length(s)\>0 then  
> begin  
> if (b) and (pos('\end{hmaufgabe}',s)=0) then  
> writeln(a,s);  
> if (((not b) and (pos(paramstr(1),s)\>0))  
> OR ((not b) and (pos(paramstr(2),s)\>0))  
> OR ((not b) and (pos(paramstr(3),s)\>0))  
> OR ((not b) and (pos(paramstr(4),s)\>0))  
> OR ((not b) and (pos(paramstr(5),s)\>0))) then  
> begin  
> b:=true;  
> writeln(a,'\item');  
> end;  
> if (pos('\end{hmaufgabe}',s)\>0) then b:=false;  
> end;  
> end;  
> end;  
> closefile(f); {$i+}  
> end;  
> end;  
>   
> {Suchen der Labels}  
>   
> procedure suche(s,t:string);  
> var r :integer;  
> p :tsearchrec;  
> begin  
>   
> r:=findfirst(s+t,faanyfile,p);  
> while (r=0) do  
> begin  
> if ((p.attr32) and  
> (p.name[1]'.')) then suche(s+p.name+'/',t)  
> else  
> begin  
> if (p.name[1]'.') and  
> (extractfileext(p.name)='.tex')  
> then lesen(s+p.name);  
> end;  
> r:=findnext(p);  
> end;  
> findclose(p);  
>   
> end;  
>   
>   
> {Header-Datei kopieren}  
>   
> procedure dateikopie;  
> var lesen:string;  
> var quelle,ziel:text;  
> const quelldat='header.tex';  
> const zieldat='aufgabe.tex';  
>   
> begin  
>   
> assign(quelle,quelldat);  
> assign(ziel,zieldat);  
> reset(quelle);  
> rewrite(ziel);  
> while not eof(quelle) do begin  
> readln(quelle,lesen);  
> writeln(ziel,lesen);  
> end;  
>   
> close(quelle);  
> close(ziel);  
> end;  
>   
>   
> {Hauptprogramm}  
>   
> begin  
>   
> clrscr;  
>   
> if paramstr(1)'' then  
> begin  
> dateikopie;  
>   
> writeln('\> Header-Datei kopiert  
> ...');  
>   
> assign(a,n);  
> append(a);  
> suche('./','\*.\*');  
>   
> writeln('\> Suche im aktuellen  
> Verzeichnis ...');  
> writeln('\> Elemente werden in  
> "aufgabe.tex" gespeichert...');  
>   
> writeln(a,'\end{enumerate}');  
> writeln(a,'\end{document}');  
> close(a);  
> end  
> else writeln('\> Kein Parameter  
> angegeben!');  
>   
> writeln('\> Ende');  
> writeln;  
>   
> end.