You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文件行读取到变量中?Delphi实现及文件结构说明

解决Delphi中按行读取文件字段到变量的问题

你这段代码的思路是对的,不过有几个小细节可以完善,还能让代码更稳健。我帮你把代码补全,再给你一些实用的建议:

基础版本(城市名无空格、产品名无空格)

如果你的产品名也没有空格,那直接用ReadLn按空格分隔读取是没问题的,完善后的代码如下:

procedure TmainForm.readProcutsBtnClick(Sender: TObject);
var
  i: Integer;
  productCity: string;
  productName: string;
  productCount: Integer;
  productFileIn: TextFile;
begin
  // 先检查文件是否存在,避免直接报错
  if not FileExists('termek.txt') then
  begin
    ShowMessage('找不到文件 termek.txt!');
    Exit;
  end;

  assignFile(productFileIn, 'termek.txt');
  try
    reset(productFileIn);
    i := 0;
    while not EOF(productFileIn) do
    begin
      i := i + 1;
      // 利用ReadLn自动按空格拆分的特性,依次赋值给三个变量
      readLn(productFileIn, productCity, productName, productCount);
      
      // 这里可以添加你的业务逻辑,比如把数据存到列表、显示到界面
      ShowMessage(Format('第%d行数据:城市=%s,产品=%s,数量=%d', [i, productCity, productName, productCount]));
    end;
  finally
    // 用try-finally确保文件一定会被关闭,哪怕中途出错
    closeFile(productFileIn);
  end;
end;

关键要点说明

  • 文件存在检查:提前判断文件是否存在,给用户明确的提示,比直接抛出异常友好得多。
  • try-finally块:不管读取过程中有没有异常,文件都会被正确关闭,避免资源泄漏。
  • ReadLn的分隔逻辑:因为城市名是无空格的,ReadLn会自动把空格作为分隔符,刚好匹配你的文件结构。

进阶版本(产品名可能包含空格)

如果你的产品名可能有空格(比如"Wireless Headset"),那上面的方法就会出错——ReadLn会把空格后的部分当成产品数量,导致类型转换失败。这种情况下,我们需要先读取整行,再手动拆分字段:

procedure TmainForm.readProcutsBtnClick(Sender: TObject);
var
  i: Integer;
  line: string;
  parts: TStringList;
  productCity: string;
  productName: string;
  productCount: Integer;
  productFileIn: TextFile;
begin
  if not FileExists('termek.txt') then
  begin
    ShowMessage('找不到文件 termek.txt!');
    Exit;
  end;

  // 创建TStringList用来拆分整行文本
  parts := TStringList.Create;
  parts.Delimiter := ' '; // 假设字段用空格分隔,要是用逗号就改成','
  parts.StrictDelimiter := True; // 严格使用指定分隔符,忽略连续空格

  assignFile(productFileIn, 'termek.txt');
  try
    reset(productFileIn);
    i := 0;
    while not EOF(productFileIn) do
    begin
      i := i + 1;
      // 先读取整行
      readLn(productFileIn, line);
      // 按分隔符拆分整行
      parts.DelimitedText := line;
      
      // 检查拆分后的字段数量是否符合要求
      if parts.Count <> 3 then
      begin
        ShowMessage(Format('第%d行格式不正确,跳过该行', [i]));
        Continue;
      end;

      productCity := parts[0];
      productName := parts[1];
      // 安全转换产品数量,避免格式错误导致崩溃
      if not TryStrToInt(parts[2], productCount) then
      begin
        ShowMessage(Format('第%d行的产品数量格式错误', [i]));
        Continue;
      end;

      // 这里添加你的业务逻辑
      ShowMessage(Format('第%d行数据:城市=%s,产品=%s,数量=%d', [i, productCity, productName, productCount]));
    end;
  finally
    closeFile(productFileIn);
    parts.Free; // 记得释放TStringList资源
  end;
end;

进阶版本优势

  • 支持带空格的产品名:通过先读整行再拆分的方式,避免了空格带来的字段拆分错误。
  • 错误处理更完善:检查字段数量、安全转换数值,哪怕某一行格式错误,程序也不会崩溃,还能给出明确提示。

内容的提问来源于stack exchange,提问作者vaso123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:36:23