File io ADA83中的while循环

File io ADA83中的while循环,file-io,while-loop,ada,File Io,While Loop,Ada,我在Ada83中编写了以下代码以查找文件大小: with Text_IO; use Text_IO; procedure imp3ada is package Int_IO is new Text_IO.Integer_IO(Integer); use Int_IO; inputFile: File_Type; i: integer:=0; fileSize: Integer:=0; fileCurrentPosition: Integer:=0; begin open(inpu

我在Ada83中编写了以下代码以查找文件大小:

with Text_IO;
use Text_IO;

procedure imp3ada is

package Int_IO is new Text_IO.Integer_IO(Integer);
use Int_IO;

inputFile: File_Type;
i: integer:=0;
fileSize: Integer:=0;
fileCurrentPosition: Integer:=0;

begin
    open(inputFile, In_File, "test.cfg");
        while not End_of_File(inputFile) loop
        fileCurrentPosition:=fileCurrentPosition+1;
        end loop;
    fileSize:=fileCurrentPosition;
    Int_IO.put(fileCurrentPosition);
    Int_IO.put(fileSize);
    close(inputFile);
end imp3ada;

代码编译得很好,但当我尝试运行它时,什么也没发生,我希望它能打印文件中的字符数。我猜它将进入一个无限循环。有人能帮我找出哪里出了问题吗?

fileCurrentPosition只是一个整数,与文件中的当前位置没有关系。由于您没有执行任何操作来遍历文件,因此它将像您观察到的那样永远递增

也许你想每次循环都得到一个角色? 在这种情况下,您可能需要调用Get函数

需要注意的另一点是:如果它是一个整数文件,Get将返回一个整数,因此您将计算文件中的整数,而不是字符。。。如果要计算文件中的字符数,可能需要使用Text\u IO而不是Int\u IO

编辑:正如Jacob指出的,在循环中调用Text_IO.Get不会准确地计算文件中的字符数,但会排除行终止字符。这对于许多应用来说都是有意义的;例如,允许您在具有不同序列的系统上进行抽象,以用于线端,例如Unix/Windows


要准确计算文件中的字符或字节,您可以为字符或字节和循环的合适定义实例化通用顺序IO包,通过Read not Get提取字符,并在文件结束时进行计数。

如果您想以任意单位计算文件的大小,您可以使用一些合适的类型进行实例化,并调用SIZE函数。概括地说

with Direct_IO;
…
package DIO is new Direct_IO(Character);
F: DIO.File_Type;
Size: Integer;
…
DIO.Open(F, DIO.In_File, Name);
Size := Integer(DIO.Size(F));
DIO.Close(F);
增编:另见

附录:我应该为简单的配置文件编写一个解析器


对于解析配置,您可以读取该文件。这样,您就不需要事先知道文件的长度。有了行后,可以对组件字符进行索引,如中所示

要回答提出的问题,您的循环:

    while not End_of_File(inputFile) loop
      fileCurrentPosition:=fileCurrentPosition+1;
    end loop;
不在任何位置操作文件类型。因此,无法达到EOF。曾经这是你的无限循环

如果您将呼叫添加到:

procedure Get(File : in  File_Type; Item : out Character);
实际上,您应该逐个字符遍历文件,并在EOF上退出循环


警告:实际上根本没有测试过

绝对是最好的方法。这将是我的答案,除了我不知道这是否适用于Ada-83…这不适用于Ada83,而我需要在Ada83单独的东西。它给了我一个错误:Direct_IO undefined和DIO undefined。据我所知,根据Ada语言和方法论,它应该适用于Ada-83,Watt,Wichmann&Findlay。您是否缺少With或Use子句?该包位于Ada 83 LRM:@user3435894:我添加了With子句和一些可能有用的引用。您是在学习、维护还是移植?由于问题的存在,使用文本IO包解决问题不是一个好主意。读取字符可能会跳过换行符和分页符,并错误处理文件结尾。只有当1文件只包含整数,2文件的大小定义为文件中整数的数量时,读取整数才有效。@Jacob:很好;我会删除答案,但可能值得留下来说明为什么不这样做。我敦促您更新您的答案,以纳入@JacobSparreAndersen的警告。我们仍然不知道这个问题的起源,你关于这个循环的回答可能会提供关键的见解。