1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Мне очень не нравится скорость побайтового чтения - 3МБ файл читается больше секунды, когда дельфовый аналог на BlockRead считывает его моментально. Всё, что приходит в голову - открыть файл для типа byte, узнать размер, потом открыть файл для массива данного размера и считать за раз.
Byte_IO.Open(SF, Byte_IO.In_File, "test.txt"); declare S: Byte_IO.Count := Byte_IO.Size(SF); type Arr is array (1..S) of byte; type AArr is access Arr; package Arr_IO is new Ada.Direct_IO(Arr); F: Arr_IO.File_Type; A: AArr; begin A := new Arr; Byte_IO.Close(SF); Arr_IO.Open(F, Arr_IO.In_File, "test.txt"); Arr_IO.Read(F, A.all); Arr_IO.Close(F); end;
Но это выдаёт raised STORAGE_ERROR : EXCEPTION_STACK_OVERFLOW (даже после того, как я вместо заведения массива на стеке завёл указатель) Да и мало ли размер файла изменится между первым и вторым открытиями. И вообще много дёргать винт это плохо.
Последний вариант - через ВинАПИ, но мне неохота туда лезть.
ПС Настраиваемые пакеты во внутреннем блоке - это сильно. Реально круто, я про язык.
А почему именно от 1 до 19? Специально, чтобы не делилось на 4?
Дальше, умеет ли компилятор определять значение Is_Workaround_Possible, убрав одну из ветвей
if Is_Workaround_Possible then ... else ... end if;
> Ни файлов, ни потоков контролируемых нет и не будет.
То есть в стандартной библиотеке не будет? Себе я сделал так:
with Ada.Streams.Stream_IO; with Ada.Finalization;
package Controlled_Streams is
type Controlled_Stream_IO is new Ada.Finalization.Limited_Controlled with record F: Ada.Streams.Stream_IO.File_Type; S: Ada.Streams.Stream_IO.Stream_Access; end record;
function New_Stream_IO(Mode : Ada.Streams.Stream_IO.File_Mode; Name : String; Form : String := "") return Controlled_Stream_IO;
private
pragma Warnings(Off);
overriding procedure Initialize (CS_IO: in out Controlled_Stream_IO); overriding procedure Finalize (CS_IO: in out Controlled_Stream_IO);
pragma Warnings(On);
end Controlled_Streams;
package body Controlled_Streams is
overriding procedure Initialize (CS_IO: in out Controlled_Stream_IO) is begin null; end;
overriding procedure Finalize (CS_IO: in out Controlled_Stream_IO) is begin if Ada.Streams.Stream_IO.Is_Open(CS_IO.F) then Ada.Streams.Stream_IO.Close(CS_IO.F); end if; end;
function New_Stream_IO(Mode : Ada.Streams.Stream_IO.File_Mode; Name : String; Form : String := "") return Controlled_Stream_IO is begin return CS_IO: Controlled_Stream_IO do CS_IO.S := null; Ada.Streams.Stream_IO.Open(CS_IO.F, Mode, Name, Form); CS_IO.S := Ada.Streams.Stream_IO.Stream(CS_IO.F); end return; end;
end Controlled_Streams;
Использование:
declare CS: Controlled_Stream_IO := New_Stream_IO(In_File, "test.txt"); begin тут работаем, про исключения и необходимость закрыть не думаем end;
Добавлено через 10 мин. Ещё такой момент. Я применил это для своего вектора. Всё зашибись, но возник облом на файле 3МБ (какое-то исключение raised ADA.IO_EXCEPTIONS.DEVICE_ERROR : Invalid argument), причём именно в случае Is_Workaround_Possible. Я принудительно выставил Is_Workaround_Possible в false. И всё нормально прочиталось, при этом программа отработала за 0.21 секунд (я так понял, тут уже не время считывания, а время запуска, инициализаций итд).