gpt4 book ai didi

delphi - 为什么我的代码会导致 I/O 104 错误?

转载 作者:行者123 更新时间:2023-12-03 19:08:16 25 4
gpt4 key购买 nike

此程序在 EoF 上引发 I/O 104 错误当第一次进入while循环时。

该程序的目的是查找用户名是否已被使用。现有用户名存储在文本文件中。

procedure TForm1.btnRegisterClick(Sender: TObject);
begin
sCUser := edtUserName.Text;
AssignFile(tNames, 'Names.txt');
begin
try
Reset(tNames);
except
ShowMessage('File not found');
Exit;
end;
end;
rewrite(tNames);
while not EoF(tNames) do // I get a I/O 104 Error here `
begin
Readln(tNames, sLine);
iPosComme := Pos(',', sLine);
sUser := Copy(sLine, 1, iPosComme - 1);
Delete(sLine, 1, iPosComme - 1);
if sCUser = sUser then begin
ShowMessage('Username taken');
end
else
begin
rewrite(tNames);
Writeln(tNames, sCUser + ',' + '0');
CloseFile(tNames);
end;
end;
end;

最佳答案

删除对 Rewrite() 的调用之前 Eof() .即使您没有收到 IO 错误,您的代码仍然会失败,因为 Rewrite()关闭您使用 Reset() 打开的文件然后它创建一个新的银行文件,所以Eof()永远是真的。

更新 : error 104file not open for input , 这意味着 Reset()未打开文件但未引发异常(如果 Eof() 引发异常,表明 {I+} 处于事件状态,这听起来像是 RTL 错误)。

在任何情况下,使用 AssignFile()和相关的例程是做文件 I/O 的老方法。您应该使用更新的技术,例如 FileOpen()FileRead() , TFileStreamTStreamReader , TStringList , ETC...

更新 : 你的循环逻辑是错误的。您只比较第一行。如果它与用户不匹配,则您正在清除文件,将用户写入新文件 关闭文件 ,然后继续循环。 EoF()届时将失败。您需要将循环重写为以下内容:

procedure TForm1.btnRegisterClick(Sender: TObject
var
SCUser, sUser: String;
tNames: TextFile;
iPosComme: Integer;
Found: Boolean;
begin
sCUser := edtUserName.Text;
AssignFile(tNames,'Names.txt');
try
Reset(tNames);
except
ShowMessage('File not found');
Exit;
end;
try
Found := False;
while not EoF(tNames) do
begin
Readln(tNames,sLine);
iPosComme := Pos(',', sLine);
sUser := Copy(sLine ,1,iPosComme -1);
if sCUser = sUser then
begin
ShowMessage('Username taken') ;
Found := True;
Break;
end;
end;
if not Found then
Writeln(tNames,sCUser + ',0');
finally
CloseFile(tNames);
end;
end;

关于delphi - 为什么我的代码会导致 I/O 104 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19335153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com