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

Pascal读取非空TXT文件时跳过while循环问题求助

问题根源:类型化文件与普通TXT文件不兼容

嘿,我一眼就揪出问题所在了——你把Pascal里的类型化文件和**普通文本文件(TXT)**搞混啦!

为什么循环会直接跳过?

你声明的f: file of wikiNew是类型化文件,这是Pascal专属的二进制格式文件,它会把wikiNew记录按二进制结构直接写入文件,和你用记事本编辑的普通TXT文本完全不是一回事。

当你用RESET(f)打开一个普通TXT文件时,Pascal会尝试把它当作wikiNew类型的二进制文件解析,结果自然匹配失败,文件指针直接跳到末尾,EOF(f)返回true,所以while循环直接被跳过。


两种解决方案任你选

方案1:继续使用类型化文件(适合Pascal程序间数据交换)

如果你的目的是用Pascal专用的记录格式存储数据,那你得先创建一个符合格式的类型化文件,而不是用普通TXT。比如先写个初始化文件的小工具:

program CreateWikiFile;
{$mode objfpc}
TYPE wikiNew=RECORD naam,omschrijving:string; END;
var f: file of wikiNew;
var wiki:wikiNew;
begin
  Assign(f, 'wiki.dat'); // 用.dat后缀区分类型化文件
  Rewrite(f);
  // 写入一条测试记录
  wiki.naam := 'TestWiki';
  wiki.omschrijving := 'Dit is een test';
  Write(f, wiki);
  Close(f);
  Writeln('类型化文件已创建');
end.

运行这个程序生成wiki.dat后,再用你的原程序打开这个文件,while循环就能正常执行了。

方案2:改为处理普通TXT文本文件

如果你的输入确实是普通TXT(比如每行是wiki名称,下一行是描述),那你需要把文件类型改成Text,并手动解析文本内容:

program Wiki_Lezen;
{$mode objfpc}
TYPE wikiNew=RECORD naam,omschrijving:string; END;
var f: Text; // 改成文本文件类型
var bestandsNaam:string;
var wiki:wikiNew;
var teller:integer;
begin
  writeln('Geef een bestandsnaam op');
  readln(bestandsNaam);
  ASSIGN(f,bestandsNaam);
  RESET(f); // 以只读模式打开文本文件
  
  // 文本文件修改中间内容较麻烦,先读取所有记录到内存,修改后再重新写入
  while not EOF(f) do
  begin
    readln(f, wiki.naam); // 读取一行作为名称
    // 若TXT中描述在下行则读取,否则设为空
    if not EOF(f) then readln(f, wiki.omschrijving)
    else wiki.omschrijving := '';
    
    writeln('wikinaam: ', wiki.naam);
    writeln('Huidige omschrijving: ', wiki.omschrijving);
    writeln('Geef een nieuwe omschrijving voor wiki');
    readln(wiki.omschrijving);
    
    writeln('Gewijzigd: ', wiki.naam, ' - ', wiki.omschrijving);
    // 这里可将修改后的记录存入数组,后续统一写入文件
  end;
  CLOSE(f);

  // 若要保存修改,取消下面注释并补充数组写入逻辑
  // Assign(f, bestandsNaam);
  // Rewrite(f);
  // 循环写入数组中的记录
  // Close(f);

  writeln;
  writeln('Om het programma te stoppen druk op <ENTER>');
  readln();
end.

注意:文本文件是流式的,直接修改中间内容会覆盖后续数据,通常的做法是先把所有内容读入内存,修改后再重新写入整个文件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:08:49