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

1 delphi delphi-7

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)

Rem*_*eau 6

删除Rewrite()之前的呼叫Eof().即使您没有收到IO错误,您的代码仍会失败,因为Rewrite()关闭您打开的文件Reset()然后它会创建一个新的银行文件,因此Eof()总是为True.

更新:错误104file not open for input,这意味着Reset()没有打开文件但是没有引发异常(如果Eof()引发异常,这听起来像RTL错误,表明它{I+}是活动的).

在任何情况下,使用AssignFile()和相关例程是执行文件I/O的旧方法.你应该使用较新的技术,如FileOpen()FileRead(),TFileStreamTStreamReader,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)