当检测到 eof 时,While 循环不会退出

While loop doesn't exit when eof is detected

提问人:Facundo Blanco 提问时间:7/31/2022 最后编辑:ChrisFacundo Blanco 更新时间:12/3/2022 访问量:301

问:

我在 while 循环的 eof 序列中遇到了问题。基本上,我必须读取一个 txt 文件(序列),每个字符都有一个不同的字符,将打印在 exit.txt 文件上。但是我的 while 循环无法识别 eof。这是我的代码。

program LaboratorioPascal;
uses crt;
var 
    sec, sal: Textfile;
    v: char;
    por_especial, cont_palabra, cont_caracter, cont_especial: integer; 
    vocales2: set of char;
    pares: set of char;
    impares: set of char;
    consonantes: set of char;
    consonantes2: set of char;

    procedure numeros(var x: char);
    begin 
        case x of
            '0': Write(sal, '0');
            '1': Write(sal, '1');
            '2': Write(sal, '4');
            '3': begin 
                     Write(sal, '2'); 
                     Write(sal, '7');
                 end;
            '4': Write(sal, '8');
            '5': begin
                     Write(sal, '1'); 
                     Write(sal, '2'); 
                     Write(sal, '5');
                 end; 
            '6': begin
                     Write(sal, '1');
                     Write(sal, '2');
                 end; 
            '7': begin
                     Write(sal, '3'); 
                     Write(sal, '4'); 
                     Write(sal, '3');
                 end;
            '8': begin
                     Write(sal, '1'); 
                     Write(sal, '6');
                 end;
            '9': begin
                     Write(sal, '7');
                     Write(sal, '2'); 
                     Write(sal, '9');
                 end;
            else Exit;
        end;
    end;

    function vocales(var s: char): char;
    begin
        case s of 
            'e': vocales := 'u';
            'a': vocales := 'o';
            'i': vocales := 'a';
            'o': vocales := 'e';
            else vocales := 'i';
        end;
    end;

begin
    assign(sec, 'input.txt');   // Le asignamos un archivo del cual lea
    reset(sec);                 // arrancamos la secuencia
    read(sec, v);               // leemos la secuencia. avz(sec, v)
    assign(sal, 'salida.txt');
    rewrite(sal);
    vocales2 := ['a', 'e', 'i', 'o', 'u'];
    pares :=  ['0', '2', '4', '6', '8'];
    impares :=  ['1', '3', '5', '7', '9'];
    consonantes := ['b', 'c', 'd', 'f', 'g', 'h', 'j','k','l','m', 'n'];
    consonantes2 := ['p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'];
    por_especial := 0;
    cont_palabra := 0;
    cont_caracter := 0;
    cont_especial := 0;
    writeln('El objetivo de este programa es cifrar un mensaje para favorecer a la inteligencia Rusa.');

    while not eof(sec) do 
    begin
        while v = ' ' do 
        begin
            write(sal, ' ');
            read(sec, v);
        end;

        cont_palabra := cont_palabra + 1;

        while v <> ' ' do
        begin
            if (v in consonantes) or (v in consonantes2) then 
            begin
                write(sal, '1');
            end
            else
            begin
                if v in vocales2 then
                begin
                    Write(sal, vocales(v));
                end
                else
                begin
                    if v in pares then;
                    begin
                        numeros(v);
                    end;

                    begin
                        if v in impares then
                        begin
                            numeros(v);
                        end
                        else
                        begin
                            cont_especial := cont_especial + 1;
                            Write(sal, '@');
                        end;
                    end;
                end;
            end;

            read(sec, v);
        end;
    end;

    write(cont_palabra, ' se crifraon con [Exito]');
    
    close(sec);
    close(sal);
end.

但是我在退出文件(salida.txt)中得到的结果是

1o1ao i1o 1u1 i1 1e1111ie 1iu 1u 1e1ae o i1o 11a11u1o@@@ 1a1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

我已经对 eof 主题进行了研究,但我找不到任何关于 pascal 的信息。如果我尝试将一个

if eof then
    Exit;
end;

在 while 循环中,它只从输入 .txt 文件中读取一个字符。

while-loop pascal eof

评论

0赞 Ken White 7/31/2022
伪代码标签显然在这里不适用,因为你正在编译和执行你的代码,所以我删除了它。另外,你是否在调试器中单步执行代码以确切地了解它正在做什么?
0赞 Stuart 8/1/2022
你有“if v in pares then;”,这看起来像是一个错误。请注意 ;在最后。
0赞 Marco van de Voort 8/1/2022
此外,从秒中读取的第一次不受EOF检查的保护,因此空文件可能会做一些奇怪的事情

答:

0赞 Bosj 12/3/2022 #1

问题在于,当您到达输入文件的末尾时,您处于内部循环中(“while v <> ' ' do”)。 如果输入文件中的最后一个字符是空格,则跳出内部循环并跳出外部循环,因为您到达了 eof。 但如果不是,你就停留在内循环中,继续阅读,直到你遇到空格或问题。

您可以更改内部循环的 “虽然 v <> ' ' 做” 自 “而 (v <> ' ') 和 (not eof(sec)) do”。

或者让它成为一个循环,并在 if 语句中处理空格。