PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aus einer .txt Datei lesen


Delphinoob
25.02.2002, 20:26
Hi Leute
Ich habe da folgende Frage:
Ich will ein Programmschreiben, wo ich aus ner .txt Datei Daten einlese. Die Daten bestehen aus
abcd.bsp
efgh.bsp
....
ich will nun das die Endung .bsp wegmachen, und die Namen in eine neue .txt Datei speichern.
Kann mir wer sagen wie das geht (wenn möglich mit sorce)

THX


Felix Kaiser
25.02.2002, 23:02
Geht ganz einfach 8)

NeuerDateiname:= ChangeFileExt(AlterDateiname,´.TXT´);

Ändert die Dateiänderung von AlterDateiname nach .TXT und liefert sie im Ergebnis, wo sie in NeuerDateiname gespeichert wird. ;)

Delphinoob
26.02.2002, 16:43
Hi, also, ich habe das jetzt mal so versucht:

var Datei : file of char;
c : char;
z : integer;


Assignfile(Datei,´c:\text.txt´);
Reset(Datei);
z:=0;
while not(eof(Datei)) do
begin
inc(z);
read(Datei,c);
if c = ´.bsp´ then begin
delete(c,z,4); //Zeile45
insert(´ ´,c,z); //Zeile46
end;
end;
end;

da bringt er mir aber die Fehlermeldungen:
[Error] Unit1.pas(45): Constant object cannot be passed as var parameter
[Error] Unit1.pas(46): Constant object cannot be passed as var parameter

Was ist daran falsch??
und wie schreibe ich das dann in die Datei?? oder macht er das damit schon gleich?

THX

Felix Kaiser
26.02.2002, 22:38
Ganz einfach: c ist ein Char-Typ (ein einzelnes Zeichen). Erstmal kannst du ein Zeichen nicht mit einer Zeichenkette vergleichen "if (c = ´.bsp´)" weil das überhaupt keinen Sinn ergibt. Folglich funktionieren Insert und Delete auch nicht, wenn du für den Stringparameter einen Zeichentyp angibst. Allgemein ist der gesamt Code ziemlicher Blödsinn, versuchs mal damit:


var
Datei1,Datei2: textfile;
s: string;
begin
Assignfile(Datei1,´c:\text.txt´);
Reset(Datei1);
Assignfile(Datei2,´c:\text.neu´);
Rewrite(Datei2);
while not eof(Datei1) do begin
Readln(Datei1,s);
while Pos(&acute;.BSP&acute;,UpperCase(s)) <> 0 do begin
Insert(&acute; &acute;,s,Pos(&acute;.BSP&acute;,UpperCase(s)));
Delete(s,Pos(&acute;.BSP&acute;,UpperCase(s)),4);
end;
Writeln(Datei2,s);
end;
CloseFile(Datei1);
CloseFile(Datei2);
Erase(Datei1);
Rename(Datei2,&acute;c:\text.txt&acute;);
end;


Bei Textdateien ist es quatsch Zeichen für Zeichen einzulesen. Mit ganzen Zeilen jeweils ist es viel handlicher und einfacher.

Delphinoob
27.02.2002, 14:22
K, das geht, THX!!!!

Trotzdem hätte ich dazu n paar Fragen, du musst sie nicht beantworten, aber es wäre schön wenn du es machen würdest:

1.)Readln(Datei1,s);---> bedeutet das, das er immer die ganze Zeile in den string s liesst?

2.)while Pos(&acute;.BSP&acute;,UpperCase(s)) <> 0 do begin
Insert(&acute; &acute;,s,Pos(&acute;.BSP&acute;,UpperCase(s)));
Delete(s,Pos(&acute;.BSP&acute;,UpperCase(s)),4);
--->daran verstehe ich nicht:
-was bewirkt &quot;uppercase&quot;?
-warum setzt du erst &acute; &acute; ein, bei insert?
-und den befehl POS, kann man damit die
aktuelle Position angeben wo man ist oder wie?


THX fürs beantworten :D

Felix Kaiser
27.02.2002, 15:53
Bei 1) liegst du richtig.

UpperCase(s) -> Wandelt die Zeichenkette s in Großbuchstaben um und liefert sie im Ergebnis. In dem Beispielsource sorgt dieser Befehl dafür dass er alle Vorkommen von .bsp beachtet, da Groß/Kleinschreibung somit egal wird.

Insert(&acute; &acute;,s,Pos(&acute;.BSP&acute;,UpperCase(s)));

Die Funktion sucht nach &acute;.BSP&acute; in der nach Großbuchstaben umgewandelten Zeichenkette und liefert die Stelle des ersten Vorkommens zurück. An dieser Stelle fügt Insert im String s nun die Zeichenkette &acute; &acute; ein, also ein einfaches Leerzeichen. Und mit dem nachfolgenden Delete Befehl entferne ich nun dieses erste Vorkommen von &acute;.BSP&acute; im String.

Die While-Schleife sorgt dafür dass er diese Befehle so oft ausführt bis der String &acute;.BSP&acute; nicht mehr im String vorkommt.

Delphinoob
27.02.2002, 17:28
k, THX, du hast mir damit echt weitergeholfen!!