使用Lazarus freepascal从.txt文件写入数据到memobox?

时间:2018-04-05 19:33:49

标签: pascal lazarus freepascal

我在学校有一个项目,需要将.txt文件中的数据写入" memobox"在Lazarus freepascal。 有这样的数据。

布达佩斯番茄23 都柏林电视45 Rosslare投影机43

我必须从.txt文件中读取这些数据,然后将它们写入Lazarus freepascal中的memobox。 如果我没有弄错,我已经从.txt文件中复制了数据,但我不知道如何编写它们。

我已经编写了这段代码:

type
cityname:integer;
product:string;
quantity:integer;
var
Form1: TForm1;
ceg:array[1..5] of rektip;
db:integer;

implementation
procedure TForm1.Button1Click(Sender: TObject);
var f:textfile; i:integer; a:char;
begin
assignfile(f,'termek.txt');
reset(f);
readln(f,db);
While not eof(f) do
begin
  readln(f,ceg[i].varosnev,a,ceg[i].termek,a,ceg[i].darabszam);
end;
db:=1;
closefile(f);
end;           


procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
For i:=1 to db do
Memo1.lines.add(ceg[i].varosnev,ceg[i].termek,IntToStr(ceg[i].darabszam));
end;
end;

我想知道如何修复它。

1 个答案:

答案 0 :(得分:0)

您发布的代码不完整,因此我假设:

type
  rektip = record
    varosnev: string;
    termek: string;
    darabszam: Integer;
  end;

您的方法存在很多问题:

readln(f,db);
While not eof(f) do
begin
  readln(f,ceg[i].varosnev,a,ceg[i].termek,a,ceg[i].darabszam);
end;
db:=1;
closefile(f);
end; 

您尚未初始化或更新i,因此您正在将所有数据读入同一条记录中,而您甚至不知道哪一条(i可能是100条,而您是&#39} ; d将数据写入某处未知 - 没有ceg[100])。这会导致未定义的行为(也可能是崩溃)。

做类似的事情:

var
  ceg: array of rektip; 

...

begin
  AssignFile(f, 'termek.txt');
  Reset(f);
  Readln(f, db);
  if db = 0 then
    Exit;
  SetLength(ceg, db);
  i := 0;
  while not eof(f) do
  begin
    Readln(f, ceg[i].varosnev, ceg[i].termek, ceg[i].darabszam);
    Inc(i);
    if i > High(ceg) then
      Break;
  end;
  SetLength(ceg, i); // remove any empty slots.
  CloseFile(f);
end; 

现在你可以将它们放入TMemo:

for i := Low(ceg) to High(ceg) do
begin
  Memo1.Lines.Add(Format('%s %s %d', [ceg[i].varosnev, ceg[i].termek, ceg[i].darabszam])); 
end;

请注意,上面的代码(从文件中读取)假定文件如下:

3
Budapest tomato 23
Dublin tv 45
Rosslare projector 43

即。每个"记录"在它自己的一行上,第一行包含记录数。