pascal在文件不为空时跳过该文件

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

我正在尝试使用pascal从txt文件中读取一些数据。 当我使用while循环在文件未结束时继续执行操作时,pascal将忽略while循环并继续执行程序的结束。 我真的不知道为什么会发生这种情况我正在使用的文件是一个.txt文件,它肯定不是空的

暗号

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.