Delphi, inlezen HTML bestand als string geeft bagger

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09 16:28

BdR

TV is gooder then books

Topicstarter
Ik probeer de inhoud van een html bestand in te lezen als string maar dit lukt niet. De eerste regels staan wel in de string variabele, maar aan het eind staat er allemaal bagger, met #0 chars etc. De FileContent variabele wijzigen in string of WideString maakt niet uit, geeft hetzelfde resultaat. Dus
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  strTemp : string;
  FileContent : WideString;
  F: TextFile;
begin
  AssignFile(F, 'c:\test\test123.html');
  Reset(F);
  while not EOF(F) do
  begin
    Readln(F, strTemp);
    FileContent := FileContent + strTemp;
  end;

  CloseFile(F);
end;

Nu bevat FileContent wel de eerste paar regels, maar daarna lijkt het op een willekeurig stuk geheugen.

Het html bestand is geedit met MSWord, dus daar zal het wel aan liggen, maar het gekke is dat het wel met notepad of ultraedit te lezen is als gewone text, dus met alle html-tags etc.

Iemand enig idee hoe dit komt en hoe het is op te lossen?

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het lijkt me sowieso niet heel efficiënt om steeds strings te lezen en 'op te tellen', en dan gebeurd er in deze code ook nog iets geks met einde-van-de-regels gok ik zo.

Dit soort code zou ik ook niet zelf verzinnen. Dus gebruik iets als:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function LoadFile(const FileName: TFileName): string;
begin
  with TFileStream.Create(FileName,
      fmOpenRead or fmShareDenyWrite) do begin
    try
      SetLength(Result, Size);
      Read(Pointer(Result)^, Size);
    except
      Result := '';  // Deallocates memory
      Free;
      raise;
    end;
    Free;
  end;
end;
Probeer het daar eens mee. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09 16:28

BdR

TV is gooder then books

Topicstarter
pedorus schreef op woensdag 10 december 2008 @ 11:57:
Het lijkt me sowieso niet heel efficiënt om steeds strings te lezen en 'op te tellen', en dan gebeurd er in deze code ook nog iets geks met einde-van-de-regels gok ik zo.

Dit soort code zou ik ook niet zelf verzinnen. Dus gebruik iets als:

[...]

Probeer het daar eens mee. :)
Bedankt voor de tip, maar dit geeft ook hetzelfde resultaat. Ik heb ook die methode van inlezen via een TStringList geprobeerd, en dat geeft ook hetzelfde.

Ik heb nog even bekeken en de eerste 4096 tekens zijn wel goed ingelezen, maar daarna begint de garbage, dus #$1E#0#0#0#1#0#0#0#$D#0#0#0.. etc. Het bestandje is trouwens 29kb, het lijkt wel of hij de bestandsindeling niet goed is ofzo. Maar ja, als ik vanaf de command prompt "type test123.html" doe, zie ik het gewoon als tekst, niks bijzonders te zien.

Het is trouwens Delphi 7 op Windows XP, misschien dat dat iets zegt?

[ Voor 5% gewijzigd door BdR op 10-12-2008 12:58 ]

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer dit eens, dit zou moeten werken (lokaal getest met html file, geen rare tekens ) , mik een button en memo op je form en copy paste :)
Delphi:
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject);
var
  strlist: TStringlist;
begin
  strlist := TStringList.Create ;
  strlist.LoadFromFile('c:\test.html');
  Memo1.Lines := strlist;
  strlist.Destroy;
end;


Memo heb ik er alleen bij gezet zodat je ook daadwerkelijk het resultaat kan zien. :)

[ Voor 10% gewijzigd door Verwijderd op 10-12-2008 13:23 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
4096 is wel erg verdacht, zit er een maximale grootte aan het string type dat je gebruikt of de grootte die je leesfunctie aankan?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Probleem ligt denk ik bij "widestring" (delphi's halfbakken unicode string type), widestring is niet nodig als je de content van een html bestand wilt laden mits je geen unicode support wilt hebben. Mijn ervaring is dat widestrings wat "langzamer" zijn in delphi 7 dan 3rd party unicode units (mocht je wel unicode support willen google dan even of kijk op torry.net) . Het voorbeeld welke ik net heb gepost werkt perfect met een html file van 2.8 MB...althans hier lokaal ;)

Acties:
  • 0 Henk 'm!

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09 16:28

BdR

TV is gooder then books

Topicstarter
Ben er inmiddels achter dat als ik een nieuw project start, en het dan inlees in een memo via TStringList gaat het gewoon goed. Ik heb het stukje code rechtstreeks geckopieerd, kaal project, formpje button memo etc. Maar binnen het project waar het om gaat werkt het niet |:( frustrerend

Dus ik vermoed dat er iets in de compiler instellingen, packages, ander units mis is? Geen idee waar ik zoeken moet, het is een groot project. :{

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


Acties:
  • 0 Henk 'm!

Verwijderd

Hmm, dat is apart, voor het standaard inlezen van een tekst /html bestand heb je geen aparte unit nodig. Knip en plakwerk zou voldoende moeten zijn. Aangezien ik de compiler settings van je project en/of externe units /vcl niet kan zien kan ik je er helaas niet meer van maken atm mee.

Ik kan zo uit me hoofd niet iets bedenken qua compiler settings of externe units/vcl welke zouden kunnen gaan bijten met een stuk simpele code als dit. :s
Pagina: 1