|
| D5 og EOF Fra : Hauge |
Dato : 22-03-06 16:45 |
|
Hej
Jeg har et "lille" problem..
Jeg har en textfile som jeg læse ca. som herunder:
assignfile(fil,'fil.txt');
reset(fil);
repeat
readln(fil,s);
until eof(fil);
Mit problem er at i den textfil er der desværre et EOF-tegn, der jo gør at
jeg ryger ud af min repeat-until.. Hvordan kan jeg omgåes det, uden at jeg
skal læse filen som enkelt-tegn med blockread?
Er der en rimelig nem måde at lave sin egen EOF-function, så man man
overskrive den som Delphi har i forvejen, som istedet for at bruge
EOF-tegnet, tjekker om man er i slutningen af filen i stedet for?
PFT.
Mvh Hauge
--
For at verificere afsenderen af dette indlæg kan du klikke her:
< http://newscheck.smart-tech.dk/20060322154550@smart-tech.dk>
På samme domæne som afsenderen af dette indlæg, ses headerne.
| |
Uffe Kousgaard (22-03-2006)
| Kommentar Fra : Uffe Kousgaard |
Dato : 22-03-06 17:33 |
|
"Hauge" <hauge@CUTsmart-tech.dk> wrote in message
news:20060322154550@smart-tech.dk...
>
> Mit problem er at i den textfil er der desværre et EOF-tegn, der jo gør at
> jeg ryger ud af min repeat-until.. Hvordan kan jeg omgåes det, uden at jeg
> skal læse filen som enkelt-tegn med blockread?
Det lyder ikke som en tekst-fil i så fald. Prøv f.eks. med TFileStream i
stedet eller blockread, som du selv er inde på.
hilsen
Uffe
| |
Hauge (22-03-2006)
| Kommentar Fra : Hauge |
Dato : 22-03-06 18:34 |
|
Hej
Uffe Kousgaard wrote:
> Det lyder ikke som en tekst-fil i så fald.
Det er en text-fil, der der består af ganske alm. text, men det system hvor
den kommer fra, bruger ascii-26 som Ü, så jeg kører noget tegnkonvertering,
hvilket ikke er noget problem. Men det er første gang jeg oplever det tegn
være i min fil, og jeg kan desværre ikke bestemme med hvilken tegntabel jeg
får filen i..
Men for at det skal være rimelig hurtigt at læse filerne ind, de er på
mellem 50.000 og 1.000.000 linjer, er readln jo en rar ting. Alle linjer
afsluttes med #13#10.
> Prøv f.eks. med
> TFileStream i stedet eller blockread, som du selv er inde på.
Så skal jeg jo desværre læse tegn for tegn, indtil jeg støder på #10,
hvilket jo tager lang tid, hvis der da ikke findes noget alternativt.
Mvh Hauge
--
For at verificere afsenderen af dette indlæg kan du klikke her:
< http://newscheck.smart-tech.dk/20060322173419@smart-tech.dk>
På samme domæne som afsenderen af dette indlæg, ses headerne.
| |
Harald (22-03-2006)
| Kommentar Fra : Harald |
Dato : 22-03-06 18:57 |
|
"Hauge" <hauge@CUTsmart-tech.dk> skrev i en meddelelse
news:20060322154550@smart-tech.dk...
> Hej
>
> Jeg har et "lille" problem..
> Jeg har en textfile som jeg læse ca. som herunder:
>
> assignfile(fil,'fil.txt');
> reset(fil);
> repeat
> readln(fil,s);
> until eof(fil);
>
> Mit problem er at i den textfil er der desværre et EOF-tegn, der jo gør at
> jeg ryger ud af min repeat-until.. Hvordan kan jeg omgåes det, uden at jeg
> skal læse filen som enkelt-tegn med blockread?
Læs f.eks. 50000 bytes ind af gangen med blockeead og så kør
tegnkonverteringen i denne blok og glem alt om at læse filen som en text
fil.
/HK
| |
Michael Haase (22-03-2006)
| Kommentar Fra : Michael Haase |
Dato : 22-03-06 20:00 |
|
Hauge skrev dette den 22-03-2006 16:45:
> Hej
>
> Jeg har et "lille" problem..
> Jeg har en textfile som jeg læse ca. som herunder:
>
> assignfile(fil,'fil.txt');
> reset(fil);
> repeat
> readln(fil,s);
> until eof(fil);
>
> Mit problem er at i den textfil er der desværre et EOF-tegn, der jo gør at
> jeg ryger ud af min repeat-until.. Hvordan kan jeg omgåes det, uden at jeg
> skal læse filen som enkelt-tegn med blockread?
Kan du ikke bruge noget àla:
assignfile(fil,'fil.txt');
> reset(fil);
> repeat
> readln(fil,s);
> until s[length(s)]=chr(26);
Så vidt jeg lige kan se må det nødvendigvis være det sidste EOF-tegn man
så stopper ved.
--
Michael Haase
| |
Nico de Jong (22-03-2006)
| Kommentar Fra : Nico de Jong |
Dato : 22-03-06 20:50 |
|
"Hauge" <hauge@CUTsmart-tech.dk> skrev i en meddelelse
news:20060322154550@smart-tech.dk...
> Hej
>
> Jeg har et "lille" problem..
> Jeg har en textfile som jeg læse ca. som herunder:
>
> assignfile(fil,'fil.txt');
> reset(fil);
> repeat
> readln(fil,s);
> until eof(fil);
>
> Mit problem er at i den textfil er der desværre et EOF-tegn, der jo gør at
> jeg ryger ud af min repeat-until..> --
Jeg plejer at gøre sådan :
assignfile.....
reset....
while not eof(fil) do
begin
readln(fil,s);
(* osv *)
end;
Nico
(Det forbavser mig lidt at Michael ikke har forslået det; han har kigget i
de fleste af mine programmer. De børn, de børn .....
| |
Hauge (22-03-2006)
| Kommentar Fra : Hauge |
Dato : 22-03-06 21:29 |
|
Hej
Nico de Jong wrote:
> Jeg plejer at gøre sådan :
Ja ok, forskellen er sådan ca. den samme, for den vil desværre fange den
forkerte EOF, altså den der er et midt i min stakkels text-fil.
Men jeg vil i morgen på arb. prøve at se hvad der kan gøres.
Mvh Hauge
--
For at verificere afsenderen af dette indlæg kan du klikke her:
< http://newscheck.smart-tech.dk/20060322202907@smart-tech.dk>
På samme domæne som afsenderen af dette indlæg, ses headerne.
| |
Nico de Jong (23-03-2006)
| Kommentar Fra : Nico de Jong |
Dato : 23-03-06 08:38 |
|
"Hauge" <hauge@CUTsmart-tech.dk> skrev i en meddelelse
news:20060322202907@smart-tech.dk...
> Hej
> Nico de Jong wrote:
> > Jeg plejer at gøre sådan :
>
> den vil desværre fange den forkerte EOF, altså den der er et midt i min
stakkels text-fil.
>
> Men jeg vil i morgen på arb. prøve at se hvad der kan gøres.
>
Jeg har lige prøvet det, og må desværre give dig ret. At jeg så synes at man
skal test på EOF _inden_ man læser en linie (der måske ikke er der), er en
anden sag.
Jeg kan ikke umiddelbart se hvordan man kan snyde READLN.
Nico
| |
Brian Andersen \(www~ (23-03-2006)
| Kommentar Fra : Brian Andersen \(www~ |
Dato : 23-03-06 09:02 |
|
Prøv følgende:
constructor TMainForm.Create(AOwner: TComponent);
begin
inherited;
FTextStrings := TStringList.Create;
end;
destructor TMainForm.Destroy;
begin
FTextStrings.Free;
inherited;
end;
procedure TMainForm.LoadTextFile(FileName: string)
begin
FTextStrings.LoadFromFile(FileName);
end;
procedure TMainForm.HandleFile;
var
I: Integer;
S: string;
begin
for I := 0 to FTextStrings.Count -1 dp
begin
S := FTextStrings[I];
..
..
..
end;
end;
/Brian
| |
Brian Andersen \(www~ (23-03-2006)
| Kommentar Fra : Brian Andersen \(www~ |
Dato : 23-03-06 09:04 |
|
>
> assignfile(fil,'fil.txt');
> reset(fil);
> repeat
> readln(fil,s);
> until eof(fil);
Denne loop konstruktion vil fejle, hvis filen er tom. Den bør derfor
konstrueres som følgende:
AssignFile(Fil, 'Fil.txt');
Reset(Fil);
while not Eof(Fil) do
begin
ReadLn(Fil, S);
..
..
..
end;
Ps. Se mit bud på en eventuel løsning med Eof markeringen senere i denne
tråd.
/Brian
| |
|
|