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
相关产品推荐
相关产品推荐

