我在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;
代码编译得很好,但是当我尝试运行时没有任何反应,我希望它能够打印文件中的字符数。我猜它会进入无限循环。有人可以帮助我解决它出错的地方吗?
答案 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循环。
警告:实际上并未对此进行过测试!