我在学校有一个项目,需要将.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;
我想知道如何修复它。
答案 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
即。每个"记录"在它自己的一行上,第一行包含记录数。