程序运行时,写入 - > - > - > - >。为什么这样做?

时间:2014-01-26 16:27:58

标签: pascal freepascal

这是程序必须读取的文本文件,并放入每个num。在一个不同的变量。 第一个数字,在这种情况下为3,是n,并告诉程序该程序要完成多少次。在nums之间,有一个空间。

文本文件f就像那样

3 2
2 1
1 5
4 2

当它运行代码时,以下内容一直在被写入

->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->

为什么会这样?

任何人都可以帮我这个程序吗?

代码如下:

Program thefinalp;

Uses SysUtils;

Var
  f: Text;
  m, d: Integer;
  n: Char;
  c: String[1];

  a, e: array of Integer;
  LowArr: Integer;
  HighArr: Integer;
  ArrayLen: Integer;
  i: Integer;

begin
  Assign(f, 'd:\tempfiles\finalp.txt');
  Reset(f);

  repeat
    Readln(f, n);
    Write(n);
  until (n = ' ');

  Read(f, c);
  Write(c);

  while not SeekEoln(f) do
  begin
    read(f, d);
    Write(d);
  End;
  Readln;
  Writeln;

  StrToIntDef(n, m);

  setlength(a, m);
  LowArr := Low(a);
  HighArr := High(a);
  ArrayLen := Length(a);

  setlength(e, m);
  LowArr := Low(e);
  HighArr := High(e);
  ArrayLen := Length(e);

  for i := LowArr to HighArr do

  begin

    repeat
      Read(f, a[i]);
      Write(a[i]);
    until (n = ' ');

    Read(f, c);
    Write(c);

    while not SeekEoln(f) do
    begin
      read(f, e[i]);
      Write(e[i]);
    End;
    Readln;
    Writeln;

  End;
  Readln;

End.

1 个答案:

答案 0 :(得分:0)

在您的第一个repeat until中,您readln进入字符。第一个字符将出现在n中,其余字符将被完全跳过,直到读取换行符。此时,您的文件指针将位于第二行数据的2

由于您的测试适用于n=' ',因此将再次执行readln,这次将2传递到n并将文件指针推送到1上第三行。

当最终到达文件结尾时,从文件中“读取”Control-Z字符。这是你看到的角色。由于它不是 Space ,循环将永远持续。

将此处的readln更改为read,并将读取一个字符。 (然后它起作用了,你可以继续讨论下一个问题......)

请记住,readln会读取,直到它读取换行符。 Read读入变量 - 如果它是一个char,它会读取一个char。如果它是一个字符串,它会读取一个字符串 - 但不是换行符。


Program thefinalp;

Uses SysUtils;

Var
f:Text;
m,d:Integer;
n:string;
n2:string;
c:String[1];

a,e:array of integer;//dynamic array//
LowArr:Integer;
HighArr:Integer;
ArrayLen:Integer;
i:Integer;
  ch : char;

function readinteger : string;
var
  st : string;
begin
  st := '';
//  read up to first digit
  repeat
    read(f,ch);
    write(ch);
  until ch in ['0'..'9'];
//accumulate digits
  repeat
    st := st + ch;
    read(f,ch);
    write(ch);
  until not (ch in ['0'..'9']);
  readinteger := st;
end;


begin
  Assign(f,'q21366050.txt');
  Reset(f);
// read first integer
  n:= readinteger;
// read second integer
  n2:= readinteger;

  m := StrToInt(n); //puts a string into an integer//

  setlength(a,m);
  LowArr:=Low(a);
  HighArr:=High(a);
  ArrayLen:=Length(a);

  setlength(e,m);
  LowArr:=Low(e);
  HighArr:=High(e);
  ArrayLen:=Length(e);

  for i:= LowArr to HighArr do
  begin
// read first integer
    n:= readinteger;
// read second integer
    n2:= readinteger;
    a[i]:=StrToInt(n); //puts a string into an integer//
    e[i]:=StrToInt(n2); //puts a string into an integer//
  End;
  Writeln;
  writeln('Results');
  for i:= LowArr to HighArr do
    writeln(inttostr(i),'=',inttostr(a[i]),',',inttostr(e[i]));
// pause to read results
  Readln;
End.

不幸的是,要弄清楚你想要做什么有点困难。该例程将读取第一行,然后将剩余的行放入[?]和e [?]。

使用描述性变量名将执行一些文档,以便您可以关注正在发生的事情。因为我实际上并不知道,所以我必须做出假设并做一些事情来填补空白。

查看主程序,首先指定一个文件名(为方便起见,我使用了q21366050.txt)并使用reset打开文件。

下一个工作是从文件中读取第一个数字。现在您只显示了一位数字,但很容易设置例程来处理序列。

n:=readinteger;

将函数readinteger的结果分配给字符串 n

readinteger以这种方式工作:首先清除字符串st,这是一个“局部变量” - 仅适用于此例程。然后继续将字符读入ch,直到字符读取范围为“0”...“9” - 因此它会跳过直到读取数字为止。然后它将数字读取添加到字符串st并继续读取字符并累积它们,直到找到的字符一个数字。 (那个字符,如果我们需要它,在ch)然后我们将累积的数字字符串分配给函数的resut。

因此,n将获得文件中的第一个string个数字;已读取下一个字符,我们知道它不是数字(否则它会被附加到返回的字符串中)。

然后我们使用n2重复此过程。将跳过下一个数字之前的所有剩余字符,返回数字序列并将以下字符放在ch

然后我们将转换字符串n的resullt分配给整数m。你没有描述其他数字可能用于什么,所以它就在那里 - 但未使用。

设置两个数组ae

然后使用相同的例程来读取下一个整数。有 CR LF 字符无关紧要 - 我们跳到下一个数字并返回它。并重复该行中的第二个数字。

转换这两个数字并将它们放入各自的数组中。

执行m次。

最初,在显示屏上写一个新行,然后另一个报告Results,然后重复m次,写一行包含迭代编号i和两个数组的值, ae,全部为整数转换为字符串,并带有=,字符,表明我们不只是重复输入的数据读取

最后,等待来自键盘的输入(因为readln没有明确的文件变量),这使得程序保持打开状态,直到我们可以看到结果。

现在 - 名义上,当然,你也应该在终止之前关闭文件......