我想讀取幾MB的二進制文件的內容並將其存儲到緩衝區中。這是我的函數原型(如果需要的話我可以改變它):如何在Ada中完整快速地讀取二進制文件?
procedure GET_BIN_CONTENT_FROM_PATH(PATH : in UNBOUNDED_STRING;
CONTENT : out UNBOUNDED_STRING);
到現在爲止我已經試過兩種方法,無論使用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;
遺憾的是,似乎如果有小於1MB其餘在文件中不會發生讀取操作。結果,大文件(> 1MB)被截斷,而小文件根本不被讀取。處理圖像時尤其明顯。
所以,我的問題是:什麼是正確的方法快速讀取二進制文件和完全?
在此先感謝。
爲一個變量分配幾MB值的堆棧數據可能會很危險。在某些系統上,這可能會耗盡你的堆棧,特別是如果函數是遞歸調用的,或者你已經使用了大部分堆棧。 – Anthony
在PC上,「堆棧太大」限制在幾百MB內。 (顯然不存在遞歸!)。所以在許多情況下,這是最簡單的選擇。小系統和嵌入式軟件,你必須設計系統的約束(在嵌入式系統中,可能會禁止動態堆分配)。 –