如何在Ada中完全快速地读取二进制文件?

tvu*_*min 4 io binaryfiles file ada

我想读取几MB的二进制文件的内容并将其存储到缓冲区中.这是我的函数原型(如果需要我可以更改它):

procedure GET_BIN_CONTENT_FROM_PATH(PATH    : in UNBOUNDED_STRING;
                                    CONTENT : out UNBOUNDED_STRING);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试了两种方法,都使用Direct_IO包.在第一种方法中,我正逐字逐句地阅读文件; 它工作,但它非常缓慢.为了加快这个过程,我尝试用MB读取文件MB:

procedure GET_BIN_CONTENT_FROM_PATH (PATH    : in UNBOUNDED_STRING;
                                     CONTENT : out UNBOUNDED_STRING) is

   BIN_SIZE_LIMIT : constant NATURAL := 1000000;
   subtype FILE_STRING is STRING (1 .. BIN_SIZE_LIMIT);
   package FILE_STRING_IO is new ADA.DIRECT_IO (FILE_STRING);
   FILE : FILE_STRING_IO.FILE_TYPE;
   BUFFER : FILE_STRING;

begin
   FILE_STRING_IO.OPEN (FILE, MODE => FILE_STRING_IO.IN_FILE,
                        NAME => TO_STRING (C_BASE_DIR & PATH));
   while not FILE_STRING_IO.END_OF_FILE (FILE) loop
      FILE_STRING_IO.READ (FILE, ITEM => BUFFER);
      APPEND (CONTENT, BUFFER);
   end loop;
   FILE_STRING_IO.CLOSE (FILE);
end GET_BIN_CONTENT_FROM_PATH;
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果文件中剩余少于1MB,似乎不会发生READ操作.结果,大文件(> 1MB)被截断,而小文件根本没有被读取.在处理图像时尤其明显.

所以,我的问题是:快速和完整地读取二进制文件的正确方法是什么?

提前致谢.

Bri*_*ond 6

使Bin_Size等于Ada.Directories.Size(my_file),并一次读取它.

如果它对于堆栈分配太大(你会得到Storage_Error)用New分配它,并使用重命名技巧

my_image : bin_array renames my_image_ptr.all;
Run Code Online (Sandbox Code Playgroud)

所以没有别的东西需要知道...
但如果它只有几MB,那就没有必要了.