EoF首次进入while循环时,该程序会引发I/O 104错误.
该程序的目的是查找是否已经使用了用户名.现有用户名存储在文本文件中.
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;
Run Code Online (Sandbox Code Playgroud)
删除Rewrite()之前的呼叫Eof().即使您没有收到IO错误,您的代码仍会失败,因为Rewrite()关闭您打开的文件Reset()然后它会创建一个新的银行文件,因此Eof()总是为True.
更新:错误104是file not open for input,这意味着Reset()没有打开文件但是没有引发异常(如果Eof()引发异常,这听起来像RTL错误,表明它{I+}是活动的).
在任何情况下,使用AssignFile()和相关例程是执行文件I/O的旧方法.你应该使用较新的技术,如FileOpen()用FileRead(),TFileStream用TStreamReader,TStringList等...
更新:您的循环逻辑错误.您只比较第一行.如果它与用户不匹配,则表示您正在擦除文件,将用户写入新文件,关闭文件,然后继续循环.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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9368 次 |
| 最近记录: |