程序不';在用pascal处理文件时不能正常工作

程序不';在用pascal处理文件时不能正常工作,pascal,Pascal,在这个程序中,当我试图将代码块[1]和[2]放入过程中时,它们在调用它们时不能正常工作,当我将它们保留在主程序中时,只有第一个代码块正常工作,第二个代码块不能正常工作,当我注释掉第一个代码块时,第二个代码块可以正常工作……您能指出错误吗,我认为这与从用户那里获取文件名有关,因为当我选择文件名时,它工作正常 program Linked_lists_files; type Node = ^T; T = record num : integer; next : Node; E

在这个程序中,当我试图将代码块[1]和[2]放入过程中时,它们在调用它们时不能正常工作,当我将它们保留在主程序中时,只有第一个代码块正常工作,第二个代码块不能正常工作,当我注释掉第一个代码块时,第二个代码块可以正常工作……您能指出错误吗,我认为这与从用户那里获取文件名有关,因为当我选择文件名时,它工作正常

program Linked_lists_files;
type
Node = ^T;
T = record
    num : integer;
    next : Node;
    End;
var
File1 : Text;
N, i, j, cmp, y, x, Num, matrixvalue : integer;
Head, Tail, Head2, Tail2, Head3, Tail3 : Node;
s : string;
matrix : array [1..20, 1..20] of Integer;

//  procedures

// [1]
Procedure fillFile();
Begin
write('Input file name to create : '); 
 readln(s);
 assign(File1,s);
 rewrite(File1);
 Repeat
 write('Enter a number : ');
 readln(N);
 if (N>=0) then
    writeln(File1, N);
 Until (N<0);
 close(File1);
End;

// [2]
Procedure GetFromFile();
Begin
cmp := 0;
 write('Enter file name to read from : '); 
 readln(s);
 assign(File1, s);
 reset(File1);
 while not eof(File1) Do
    Begin
        readln(File1, N);
        if (Head = Nil) then
        Begin
            new(Head);
            Tail := Head;
        End
        Else
        Begin
            new(Tail^.next);
            Tail := Tail^.next;
        End;
        Tail^.num := N;
        Tail^.next := Nil;
        cmp := cmp + 1;
    End;
Close(File1);
Write('Elements of the list : ');
Tail := Head;
if (Head<>nil) then
Begin
    while(Tail <> nil) Do
    Begin
        write('[',Tail^.num,']', ' ');
        Tail := Tail^.next;
    End;
End
Else
Writeln('[!] The list is empty');
writeln;
writeln('Number of elements in the list : ', cmp);
End;

// [3]
Procedure SaveFromFile();
Begin
Head :=  Nil;
write('Enter file name to read from : '); readln(s);
writeln('[+] Fill in your list');
Repeat
write('+ Enter an integer : ');
read(y);
if (y>=0) then
Begin
if (Head = Nil) then
Begin
    new(Head);
    Tail := Head;
End
Else
Begin
    new(Tail^.next);
    Tail := Tail^.next;
End;
Tail^.num := y;
Tail^.next := Nil;
End;
Until y<0;
assign(File1, s);
rewrite(File1);
Tail := Head;
while(Tail <> nil) Do
Begin
    Num := Tail^.num;
    Tail := Tail^.next;
    Writeln(File1, Num);
End;
Close(File1);
Writeln('[+] Elements of the lists have been successfully added to the new file');
End;

// [4]
Procedure SquareMatrix();
Begin
cmp := 0;
x := 0;
writeln('[+] Fill in your list');
Repeat
write('+ Enter an integer : ');
read(y);
if (y>=0) then
Begin
if (Head3 = Nil) then
Begin
    new(Head3);
    Tail3 := Head3;
End
Else
Begin
    new(Tail3^.next);
    Tail3 := Tail3^.next;
End;
Tail3^.num := y;
Tail3^.next := Nil;
cmp := cmp + 1;
End;
Until y<0;

while (cmp<>1) Do
Begin
    if (cmp mod 2 <> 0) and (cmp <> 1) then 
        x := x + 1;
    cmp := cmp div 2;
End;    
if (x>0) then
writeln('[-] False')
Else
writeln('[+]True');
End;

// [5]
Procedure ElementsOfSM();
Begin
cmp := 0;
x := 0;
writeln('[+] Fill in your list');
Repeat
write('+ Enter an integer : ');
read(y);
if (y>=0) then
Begin
if (Head = Nil) then
Begin
    new(Head);
    Tail := Head;
End
Else
Begin
    new(Tail^.next);
    Tail := Tail^.next;
End;
Tail^.num := y;
Tail^.next := Nil;
cmp := cmp + 1;
End;
Until y<0;
Tail := Head;
i := 1;
j := 1;
        while(Tail <> nil) Do
        Begin
            matrixvalue := Tail^.num;
            matrix[i,j] := matrixvalue;
            Tail := Tail^.next;
            j := j + 1;
            if (j = sqrt(cmp)+1) then
                Begin
                    i := i + 1;
                    j := 1;
                End;
            
        End;
for i:=1 to cmp Do
    for j:=1 to cmp Do
    Begin
        if (matrix[i,j]<>0) then
        writeln('[',matrix[i,j],']',' : ','[',i,',',j,']');
    End; 
End;

// [6]
Procedure Element();
Begin
write('Enter the number of the line : ');
read(i);
write('Enter the number of the column : ');
read(j);
write('The element corresponding to ','[',i,',',j,'] is : ','[',matrix[i,j],']');
writeln;
End;

// [7]
Procedure WriteP();
Begin
write('Enter the number of the line : ');
read(i);
write('Enter the number of the column : ');
read(j);
write('Enter the value you want to pass in : ');
read(N);
matrix[i,j] := N;
writeln('The new matrix');  
for i:=1 to cmp Do
    for j:=1 to cmp Do
    Begin
        if (matrix[i,j]<>0) then
        writeln('[',matrix[i,j],']',' : ','[',i,',',j,']');
    End; 
writeln;
End;

// [8]
Procedure Content();
Begin
write('Enter the number of the line : ');
read(i);
write('Enter the number of the column : ');
read(j);
writeln('The value stored inn this cell is : ','[', matrix[i,j],']');
End;

// Start of main program
Begin
 Head := Nil;
 Repeat
 writeln('*********** MENU ***********');
 writeln('[1] fillFile');
 writeln('[2] GetFromFile');
 writeln('[3] SaveFromFile');
 writeln('[4] SquareMatrix');
 writeln('[5] ElementsOfSM');
 writeln('[6] Element');
 writeln('[7] WriteP');
 writeln('[8] Content');
 writeln('*********** End ***********');
 write('Choose one : ');
 read(N);
 
 case N of
 1 : fillFile();
 
 2 : GetFromFile();
 
 3 : SaveFromFile();
 
 4 : SquareMatrix();
 
 5 : ElementsOfSM();
 
 6 : Element();
 
 7 : WriteP();
 
 8 : Content();
 End;
 
 Until (N<>1) and (N<>2) and (N<>3) and (N<>4) and (N<>5) and (N<>6) and (N<>7) and (N<>8) and (N<>9);

End.
程序链接的\u列表\u文件;
类型
Node=^T;
T=记录
num:整数;
下一步:节点;
结束;
变量
文件1:文本;
N、 i,j,cmp,y,x,Num,matrixvalue:integer;
头,尾,头2,尾2,头3,尾3:节点;
s:字符串;
矩阵:整数的数组[1..20,1..20];
//程序
// [1]
程序fillFile();
开始
写入('要创建的输入文件名:');
readln(s);
分配(文件1,s);
重写(文件1);
重复
写('输入一个数字:');
readln(N);
如果(N>=0),则
writeln(文件1,N);
直到(N=0)然后
开始
如果(水头=零),则
开始
新(首长);;
尾:=头;
终点
其他的
开始
新的(尾^下一个);
Tail:=Tail^.next;
结束;
Tail^.num:=y;
Tail^.next:=Nil;
结束;
直到y=0)然后
开始
如果(水头3=零),则
开始
新设(总目3);;
Tail3:=Head3;
终点
其他的
开始
新的(第3页^下一页);
Tail3:=Tail3^.next;
结束;
Tail3^.num:=y;
Tail3^.next:=Nil;
cmp:=cmp+1;
结束;
直到y0)然后
writeln(“[-]False”)
其他的
writeln('[+]True');
结束;
// [5]
程序元素sofsm();
开始
cmp:=0;
x:=0;
writeln(“[+]填写您的列表”);
重复
写入('+输入整数:');
读(y);
如果(y>=0),则
开始
如果(水头=零),则
开始
新(首长);;
尾:=头;
终点
其他的
开始
新的(尾^下一个);
Tail:=Tail^.next;
结束;
Tail^.num:=y;
Tail^.next:=Nil;
cmp:=cmp+1;
结束;

直到y为止,您描述的问题是由
Read
语句的已知行为引起的;基本上,第二次(以及随后)调用它时,它会立即返回,无需等待任何键盘输入,也无需读取任何内容

这是因为FPC在商业Delphi开发包中紧密地基于Object Pacal,在Delphi的例子中,这是官方记录的行为

从Delphi(v7)联机帮助:

Delphi语法: 文本文件: 过程读取([var F:Text;]V1[,V2,…,Vn])

描述 在Delphi代码中可以通过以下方式使用读取过程。 [...] 使用类型字符串变量:

Read读取到但不包括下一行末尾的所有字符 标记或直到Eof(F)变为真;阅读后不会跳到下一行。如果生成的字符串长于字符串变量的最大长度,则该字符串将被截断。 第一次读取后,每次后续读取都会看到行尾标记,并返回一个零长度字符串(添加了强调)。 使用多个Readln调用读取连续的字符串值

幸运的是,解决方案很简单,使用
readln
,而不是像中那样使用
read

readln(s);
更新确保用
readln
替换
read
所有实例,因为@TomBrunberg评论说,您保留了许多未更改的实例


之后,再次运行代码并从菜单中选择
1
,您会发现
fillFile
执行,但程序会在
直到…
行终止。这是因为在整个程序中使用相同的全局变量是一个非常糟糕的主意,在这种情况下,在整个程序中使用不同的目的。因此,您应该进一步(小心地)编辑代码,使其尽可能只为全局目的使用全局变量。将所有所有其他变量转换为局部变量,最好使用与全局变量不同的名称。如果在此之后您仍然存在问题,请提交一个新的问题,重点关注该问题。

当您将打开的文本文件作为参数传递时,您必须通过引用而不是通过值传递它,即过程
DoSomething(var F:text…
,而不是
过程DoSomething(F:Text…
。您好,谢谢,但是如果不向过程提供任何参数,然后调用它,就不可能让用户传入我们想要从中获取数据或写入数据的文件名?因为当我对第一块代码这样做时,它会直接要求输入一个数字,而不允许我输入文本名文件我想为第二个创建相同的东西问题再次提出,当我只编译第一段代码时,它工作得很好,但当我将它用作一个过程时,它不工作,你发现的问题再次发生了。我应该给你提供过程吗?你到底在说什么问题?无论如何,是的,提供过程。是的,提供过程问题就是你提到的那个,但是使用ReadLn并不能很好地解决它。请在你的q中编辑代码,以显示你现在所说的不起作用。