[Delphi] textfile inlezen naar record

Pagina: 1
Acties:

  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Ik kom er niet uit. Ik heb dit nu zo :

Ik heb dus een record gemaakt. Ik wil een bierlijst inlezen die gewoon in een textfile staat. Per regel, de naam van de drank, de belastingcategorie en de prijs. Deze moeten dan worden. Prijzen[1].naam := bier. Prijzen[1].categorie := 1; en prijzen[1].prijs := 0.80; Maar nu maakt hij ervan Prijzen[1].naam := Bier 1 0.80. En dat moet dus niet.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TForm1.Button1Click(Sender: TObject);
var
leesfile: textfile;
i: integer;
num : word;

begin
i := 0;
opendialog1.execute;
if fileexists(opendialog1.filename) then
begin
  assignfile(leesfile, opendialog1.filename);
  reset(leesfile);
  setlength(prijzen,num) ;
  while not (eof(leesfile)) do
  begin
   with prijzen[i] do
    begin
      readln(leesfile, naam, categorie, prijs);
    end;
    inc(i);
   end;

end

else

begin
  showmessage('gekozen file is niet geldig');
end
end;
end.


nu probeert hij alles in te lezen in de eerste naam van record 1, dit moet niet natuurlijk.

[ Voor 37% gewijzigd door REDFISH op 01-07-2003 11:39 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Wat moet er dan wel?
Misschien is het handig als je eens de P&W Quickstart leest en je je post aanpast met de nodige info.
Wat wil je, wat doet hij, wat doet hij niet, etc....

https://fgheysels.github.io/


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Hmm... Je plopt hier nu een hoop code neer met een korte melding: hij doet dit, maar dat moet niet. Vervolgens wil je dat wij je code zo gaan aanpassen dat je een werkend geheel krijgt? Dit is niet helemaal de bedoeling. Geef iets duidelijker aan waar het mis gaat, wat je hebt geprobeerd om het te verhelpen en post alleen releveantie code in plaats van de complete unit.

Tipje: je hebt num nergens een waarde gegeven, dus je 'Prijzen' is maar 1 record lang, omdat num standaard 0 is.

[ Voor 5% gewijzigd door OZ-Gump op 01-07-2003 11:34 ]

My personal website


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Hmmm, maar dan nog leest hij in die eerste eigenschap prijzen[1].naam := Bier 1 0.80
en niet zoals in mijn bovenstaande aangepaste verhaal prijzen[1].naam := bier
cat 1 en prijs 0.80.

  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 22-08 22:36
REDFISH schreef op 01 July 2003 @ 11:38:
Hmmm, maar dan nog leest hij in die eerste eigenschap prijzen[1].naam := Bier 1 0.80
en niet zoals in mijn bovenstaande aangepaste verhaal prijzen[1].naam := bier
cat 1 en prijs 0.80.
Dus ziet hij die hele regel als 1 string en niet gesplitst in meerdere velden.

Hoe zit het met de inhoud van je file? Scheidingstekens?

"If you don't know where you are going, any road will take you there"


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
je moet idd even in het looptje,

Delphi:
1
2
inc(num);
setlength(prijzen,num);

doen (en ik zou num een integer maken)

This message was sent on 100% recyclable electrons.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

REDFISH schreef op 01 juli 2003 @ 11:38:
Hmmm, maar dan nog leest hij in die eerste eigenschap prijzen[1].naam := Bier 1 0.80
en niet zoals in mijn bovenstaande aangepaste verhaal prijzen[1].naam := bier
cat 1 en prijs 0.80.
Hoe wil jij dan dat Delphi snapt wanneer de naam eindigt en de categorie begint? Heb je ergens een scheidingsteken opgegeven, of heb je zoiets van: als ik dat snap, snapt de PC dat ook vast wel :+

Oftewel: even nadenken over hoe je Delphi kunt laten begrijpen waar het ene veld ophoudt en het volgende begint...

My personal website


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Er staat een mooie spatie tussen de elke info, en read kan daar in ieder geval mee overweg

dus

textfile inhoud:
bier 1 0.80

maar ook dit werkt niet:
Delphi:
1
2
3
read(leesfile,prijzen[i].naam);
   read(leesfile,prijzen[i].categorie);
   read(leesfile,prijzen[i].prijs);

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Hmm... ook dit werkt niet.
Wat gebeurt er dan? Anders wordt het heel moeilijk om te helpen.

My personal website


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 22-08 22:36
Volgens mij gaat dit met standaard read functies niet werken, je leest altijd de hele regel in. Schrijf zelf een stukje code dat de spatie als scheidingsteken ziet.

"If you don't know where you are going, any road will take you there"


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
wat er gebeurt, is dat van mijn array prijzen

prijzen[0].naam := Bier 1 0.80 wordt ipv

prijzen[0].naam :=bier;
prijzen[0].categorie :=1;
prijzen[0].prijs:=0.80;

dus ik moet een stukje code hebben dat een textbestand met data inleest naar een record. Waarbij het textbestand informatie heeft die gescheiden is door een spatie of welk ander scheidingsteken dan ook. Ik ben nog net wel slim genoeg om te snappen dat er een scheidingsteken tussen moet.

Ik wil dus dat ik met een regel of een paar regels code zeg maar dat textbestand kan lezen

  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 22-08 22:36
Kijk hier maar eens naar, dat is wat je nodig hebt:

http://gathering.tweakers.net/forum/view_message/17717348

"If you don't know where you are going, any road will take you there"


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Probeer BlockRead eens. Uit de Delphi help:
Reads one or more records from an open file into a variable.

My personal website


Verwijderd

Gebruik iets als dit:

ik trek een string uit elkaar door te zoeken naar cSEP (een karakter dat als 'seperator' dient) en voeg de individuele strings toe in een stringlist die je meegeeft aan de functie.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.StripString(sIn: string; cSEP: char;
  lstString: TStrings);
var
  p: integer;
begin
  if Assigned( lstString ) then
  begin
    repeat
      p := Pos( cSEP, sIN );
      if p <> 0 then
      begin
        lstString.Add( Copy(sIn, 0, p));
        sIn := Copy( sIn, p+1, Length( sIN ) - p + 1);
      end;
    until p = 0;
    lstString.Append(sIn);
  end
  else
    Showmessage('wel een list meegeven s.v.p!');
end;


implementatie voorbeeld:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Button1Click(Sender: TObject);

var
  F: TextFile;
  i: integer;
  sIn: string;
  lstS: TStringList;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(F, OpenDialog1.FileName );
    Reset(F);
    ReadLn( F, sIn );
    lstS := TStringList.Create;  
    try
      StripString( sIn, ' ', lstS );
      for i:=0 to lstS.Count - 1 do
      ShowMessage( lstS[i] );
    finally
      lstS.Free;
    end;   
  end;
end;


edit:
.. ohoh.. vergeten lstS vrij te geven 8)7
en nog een keer code aangepast aan mooie layout mogelijkheid (sorry hoor.. eerste post enzo)

[ Voor 17% gewijzigd door Verwijderd op 01-07-2003 12:33 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

OZ-Gump schreef op 01 juli 2003 @ 12:09:
Probeer BlockRead eens. Uit de Delphi help:
[...]
Dan moeten die records wel zijn weggeschreven met blockwrite :)

En voor de TS:
In het geval van een platte text file kan je die het beste regel voor regel inlezen en parsen. Kijk eens naar functies zoals pos() en copy()

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

dat is idd de beste oplossing :7

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


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

* Tomatoman vindt dat de code de bierprijs automatisch moet verlagen. 80 cent is nog veel te duur :+

Een goede grap mag vrienden kosten.

Pagina: 1