这是程序必须读取的文本文件,并放入每个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.
答案 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
。你没有描述其他数字可能用于什么,所以它就在那里 - 但未使用。
设置两个数组a
和e
。
然后使用相同的例程来读取下一个整数。有 CR LF 字符无关紧要 - 我们跳到下一个数字并返回它。并重复该行中的第二个数字。
转换这两个数字并将它们放入各自的数组中。
执行m
次。
最初,在显示屏上写一个新行,然后另一个报告Results
,然后重复m
次,写一行包含迭代编号i
和两个数组的值, a
和e
,全部为整数转换为字符串,并带有=
和,
字符,表明我们不只是重复输入的数据读取
最后,等待来自键盘的输入(因为readln
没有明确的文件变量),这使得程序保持打开状态,直到我们可以看到结果。
现在 - 名义上,当然,你也应该在终止之前关闭文件......