在ADA83中循环

时间:2014-05-03 14:32:55

标签: 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(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;

代码编译得很好,但是当我尝试运行时没有任何反应,我希望它能够打印文件中的字符数。我猜它会进入无限循环。有人可以帮助我解决它出错的地方吗?

3 个答案:

答案 0 :(得分:5)

如果要以任意单位查找文件的大小,可以使用某种合适的类型实例化Direct_IO并调用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);

附录:另见

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

对于解析配置,您可以阅读文件Line_By_Line。这样,您无需事先知道文件的长度。获得Line后,您可以将组件字符编入索引,如§3.6.3. The Type String所示。

答案 1 :(得分:3)

fileCurrentPosition只是一个整数,与文件中的当前位置无关。由于你没有做任何事情来推进整个文件,它会像你观察到的那样永远增加..

也许你想在每次循环中获得一个角色? 在这种情况下,您可能需要拨打" Get"功能...

需要注意的另一点是:如果它是一个Integer文件,Get将返回一个Integer,因此你将计算文件中的整数,而不是字符...如果你想计算文件中的字符,你可能需要使用Text_IO而不是Int_IO。

编辑:正如雅各布指出的那样,在循环中调用Text_IO.Get将无法准确计算文件中的字符数,但排除了行终止字符。这对许多应用来说都很有意义;允许你抽象例如在具有不同序列的系统上#34;行尾"例如Unix / Windows。

要准确计算文件中的字符(或字节),您可以为字符实例化通用Sequential_IO包(或者#34; byte"的合适定义)并循环,如上所述,提取字符通过Read(不是Get)并将其计算到End_Of_File

答案 2 :(得分:3)

回答提出的问题,你的循环:

    while not End_of_File(inputFile) loop
      fileCurrentPosition:=fileCurrentPosition+1;
    end loop;

不会在任何地方操纵文件类型。因此不会达到EOF。永远。这是你的无限循环。

如果您致电:

procedure Get(File : in  File_Type; Item : out Character);

你应该逐个字符遍历文件并退出EOF循环。

警告:实际上并未对此进行过测试!