如何将文件行读取到变量中?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
相关产品推荐
相关产品推荐

