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)被截断,而小文件根本没有被读取.在处理图像时尤其明显.
所以,我的问题是:快速和完整地读取二进制文件的正确方法是什么?
提前致谢.
使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,那就没有必要了.
| 归档时间: |
|
| 查看次数: |
2659 次 |
| 最近记录: |