pascal在文件不为空时跳过该文件
我正在尝试使用pascal从txt文件中读取一些数据。 当我使用while循环在文件未结束时继续执行操作时,pascal将忽略while循环并继续执行程序的结束。 我真的不知道为什么会发生这种情况我正在使用的文件是一个.txt文件,它肯定不是空的 暗号pascal在文件不为空时跳过该文件,pascal,Pascal,我正在尝试使用pascal从txt文件中读取一些数据。 当我使用while循环在文件未结束时继续执行操作时,pascal将忽略while循环并继续执行程序的结束。 我真的不知道为什么会发生这种情况我正在使用的文件是一个.txt文件,它肯定不是空的 暗号 program Wiki_Lezen; {$mode objfpc} TYPE wikiNew=RECORD naam,omschrijving:string; END; var f: file of wikiNew; va
program Wiki_Lezen;
{$mode objfpc}
TYPE wikiNew=RECORD
naam,omschrijving:string;
END;
var f: file of wikiNew;
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
read(f,wiki);
writeln('wikinaam: ', wiki.naam);
writeln('Geef een omschrijving voor wiki');
readln(wiki.omschrijving);
write(f,wiki);
end;
CLOSE(f);
writeln;
writeln('Om het programma te stoppen druk op <ENTER>');
readln();
end.
程序Wiki\u Lezen;
{$mode objfpc}
键入wikiNew=RECORD
naam,omschrijving:字符串;
结束;
var f:wikiNew的文件;
var bestandsNaam:字符串;
var-wiki:wikiNew;
var-teller:整数;
开始
书面形式(“Geefeen bestandsnaam op”);
readln(贝斯坦斯纳姆);
分配(f、bestandsNaam);
重置(f);
而不是EOF(f)呢
开始
阅读(f,维基);
writeln('wikinaam:',wiki.naam);
书面语(“Geefeen omschrijving voor wiki”);
readln(wiki.omschrijving);
写作(f,wiki);
结束;
关闭(f);
书面语;
书面形式(“停止程序操作”);
readln();
结束。
更新我已将示例代码和此答案的其余部分更新为
使用Marco van de Voort评论中建议的短字符串,对此我深表感激。用我更新的代码,
它创建和读取数据文件,我无法重现您的问题。
代码将3条wiki
记录写入文件并成功地将其读回
program ReadTextFileTestShortString;
{$mode objfpc} //{$H+}
uses
SysUtils;
type wikiNew = record
naam,omschrijving:string;
end;
var f : file of wikiNew;
var bestandsNaam:string;
var wiki:wikiNew;
var teller:integer;
begin
// First construct a data file name, based on the executable's name
bestandsNaam := ExtractFilePath(ParamStr(0)) + ' Wiki.Dat';
// Next, generate the file
Assign(f, bestandsNaam);
Rewrite(f);
for teller := 1 to 3 do begin
wiki.naam := 'Name' + IntToStr(teller);
wiki.omschrijving := 'Omschrijving' + IntToStr(teller);
write(f, wiki);
end;
// Now, read the file
Reset(f);
while not Eof(f) do begin
read(f, wiki);
writeln('Name: ', wiki.naam);
writeln('Description: ', wiki.omschrijving);
end;
Close(f);
readln;
end.
我将不得不让你去调查为什么你会变得与众不同
代码的行为。也许“用户”没有输入一个
包含绝对路径,因此读取的文件版本与
你假设的那个
顺便说一句,这个答案的前一个版本是基于以下假设的
您使用了所谓的“巨大”字符串,并获得了否决票。那是
这很合理,但我希望现在可以取消否决票
我不明白您是如何编译代码的。汤姆·布伦伯格
注释中指出,FPC中的字符串是引用类型,不能声明
引用类型的文件。当我试图编译你的代码时,我得到
pas(12,26)错误:类型化文件不能包含引用计数类型
对于字符串
,FPC不允许文件
包含
字符串是非常明显的:字符串可以包含任意的字符串序列
字符长度高达2Gb,因此在读取文件时,RTL将没有任何方法
知道一个字符串字段的结束位置和下一个字段或记录的开始位置。历史上,Pascal记录文件总是基于
具有固定长度,在编译时已知,因此编写过程
记录到文件的实例只需写入
将内存中的记录保存到文件中
因此,如果要存储包含字符串字段的记录,最简单的方法是
方法是使用文本文件并存储记录的各个字段
作为其中的单独行,例如:
代码:
因此,不要试图将[record]
文件的Pascal文件与文本文件混用<代码>文件的[记录]
文件在正确使用时确实可以正常工作,但需要基于固定长度的记录,而wikiNew的文件不一定是固定长度的,因为记录定义包括字符串
字段
顺便说一句,有一个评论大意是“启动阅读”可能是必要的。它不是,而且对于正确编写的Pascal代码应该永远都不需要。wikinew记录是512字节(两个短字符串,每个长度为255个字符+1个字节)
您的文件是一系列512字节的记录,其中包含两个短字符串吗?或者您正在尝试读取一般文本文件?那不行。“文件”仅用于恒定大小的数据
您要查找的文件类型是文本,或者如果不允许,则需要char文件。您可能需要执行“启动读取”—即,在进入WHILE
循环之前,尝试读取第一条记录。您测试了吗?如果我这样做了,我发现这是一个短串又名TP stringOuch!不,马可。谢谢你的提醒!为什么要读取和写入同一个文件?这在的文件中是允许的,可以查看。但是文件指针一直在前进。建议在每次读取后转储filepos(f)或wiite(f to debugPure objfpc mode是shortstring。只有{$mode objfpc}{$h+}是ansisting。我猜他试图以这种方式读取普通文本文件。这行不通。“file of”仅用于恒定大小的数据。text,或者如果不允许,则需要char文件。
uses
SysUtils;
type wikiNew = record
naam,omschrijving:string;
end;
var f : Text; // declares a text file
var bestandsNaam:string;
var wiki:wikiNew;
var teller:integer;
begin
// First construct a data file name, based on the executable's name
// This is to avoid the user having to type the file name correctly
// and to ensure that the file name includes an absolute path
bestandsNaam := ExtractFilePath(ParamStr(0)) + ' Wiki.Dat';
// Next, generate the file
Assign(f, bestandsNaam);
Rewrite(f);
for teller := 1 to 3 do begin
wiki.naam := 'Name' + IntToStr(teller);
wiki.omschrijving := 'Omschrijving' + IntToStr(teller);
writeln(f, wiki.naam);
writeln(f, wiki.omschrijving);
end;
// Now, read the file
Reset(f);
while not Eof(f) do begin
readln(f, wiki.naam);
readln(f, wiki.omschrijving);
writeln('Name: ', wiki.naam);
writeln('Description: ', wiki.omschrijving);
end;
Close(f);
readln;
end.