Ada:使用SET_OUTPUT重定向输出的灵活Text_IO File_Type?



我继承了一个具有两种输出模式的项目,控制台和纯文本文件。 该项目使用Ada.Text_IO。SET_OUTPUT选择一个或另一个。

我想创建第三个SET_OUTPUT选项,一个可以轻松地将输出重定向到标准输出或磁盘文件以外的各种格式的选项。 我希望输出是某种 RAM 中的对象或"文件",以便多个客户端可以快速读取它。 我还需要保持代码的可移植性,因此理想情况下解决方案将坚持使用标准库。

我已经尝试了Sequential_IO的实例化,但代码库太大且不一致(Text_IO过程的重载和重命名以及Text_IO是否由全点表示法调用(无法快速可靠地替换调用。

我一定没有创造力(我当然是Ada的新手(,但我不断提出的解决方案似乎过于复杂和令人费解 - 在低级别的内存池中创建Text_IO File_Type的容器;然后SET_OUTPUT到RAM文件中,从那里可以将其推送或拉取到客户端。

我希望我错过了一些东西,并且有人可以帮助我找到更简单的方法。 提前谢谢。

Text_IO专门用于文件,因此没有便携式方法可以使用它来写入内存。允许写入文件、内存或您可以定义的任何其他内容的正常方法是使用流,但这需要将大多数Text_IO用法替换为使用流。如果这是可以接受的,那么Ada.Text_IO.Text_Streams允许将Current_Output写入流。

如果你不打算更改所有Text_IO调用,你将被文本输出到你选择的内存(例如(存储中,这可能意味着文本内容(除非你的历史开发人员严格遵守可解析的格式标准!

假设 GNAT,IO 处理文件的方式在 GNAT 参考手册中有所描述;特别是,文件不需要是常规磁盘文件,只要它可以通过 C 系统调用访问,例如fopen().因此,您可以通过管道连接到日志存储管理器。

另一方面,您可以只使用共享文件(请参阅 GNAT RM 的表单字符串部分(。

系统是否只有一个可能的文本文件输出?这将使事情变得更容易...

我会尝试这样的东西:

type Extended_File_Type is record
Is_Normal : Boolean;
File      : Ada.Text_IO.File_Type;
Special   : Integer;  --  <- Dummy, replace by your fancy in-RAM object.
end record;
procedure Put_Line (EFile : Extended_File_Type; S : String) is
begin
if EFile.Is_Normal then
Ada.Text_IO.Put_Line (Efile.File, S);
else
null;  --  Output to your special object.
end if;
end;

相关内容

最新更新