Ada_Ru форум

Обсуждение языка Ада

os_lib - bugs

Оставить новое сообщение

Сообщения

Aleksey Ulasevich
os_lib - bugs
2005-08-12 08:16:43

Обнаружил глюк в Os_Lib при работе с файлами.

Используя Creat_File (или Create_New_File) создаю файл. Затем записываю командой Write в него запись размером 20 байт. После чего закрываю файл командой Close. Команда Write выдала в результате 20, на всякий случай вставил File_Length перед Close - 20. Смотрю на файл средствами ОС (команда ls и тп) - размер файла 8GB !!! Причем первые 20 байт мои )

 

-- С уважением,

Алексей Ю. Уласевич

(A.STAKANOV)

http://www.livejournal.com/users/a_stakanov/

Aleksey Ulasevich пишет:

 

Обнаружил глюк в Os_Lib при работе с файлами.

Используя Creat_File (или Create_New_File) создаю файл. Затем записываю командой Write в него запись размером 20 байт. После чего закрываю файл командой Close. Команда Write выдала в результате 20, на всякий случай вставил File_Length перед Close - 20. Смотрю на файл средствами ОС (команда ls и тп) - размер файла 8GB !!! Причем первые 20 байт мои )

 

Прошу прощения. Просто я некорректно использовал LSeek перед Write. Теперь все ОК. )

 

-- С уважением,

Алексей Ю. Уласевич

(A.STAKANOV)

http://www.livejournal.com/users/a_stakanov/

Aleksey Ulasevich wrote:

 

Обнаружил глюк в Os_Lib при работе с файлами.

Используя Creat_File (или Create_New_File) создаю файл. Затем записываю командой Write в него запись размером 20 байт. После чего закрываю файл командой Close. Команда Write выдала в результате 20, на всякий случай вставил File_Length перед Close - 20. Смотрю на файл средствами ОС (команда ls и тп) - размер файла 8GB !!! Причем первые 20 байт мои )

 

Прошу прощения. Просто я некорректно использовал LSeek перед Write. Теперь все ОК. )

 

Вот поэтому и не стоит использовать нестандартные Ada пакеты :)

 

Адские средства ввода-вывода даже на сегодняшний день остаются весьма прогрессивными: они включают и текстовый ввод-вывод, и посделовательный типизированный, и прямой типизированный, и последовательный поточный (нетипизированный).

 

Использование остальных способов - однозначно не несть хорошо!

 

-- Vadim Godunko

 

Technoserv A/S

Rostov-on-Don, Russia

On Mon, Aug 15, 2005 at 11:53:46AM +0400, Vadim Godunko wrote:

 

Адские средства ввода-вывода даже на сегодняшний день остаются весьма прогрессивными: они включают и текстовый ввод-вывод, и посделовательный типизированный, и прямой типизированный, и последовательный поточный (нетипизированный).

 

 

Расскажите мне, как правильно читать двоичные файлы.

Например zip-архивы, формат которых описан в терминах

байтов. Или xml-файлы, кодировка которых заранее не

известна (по сути ведь тоже последовательность байт,

значение которых преобразуются в символы после

использования процедуры раскодирования).

 

Самый простой вариант - читать их как поток Character

наверное не есть самый правильный.

 

Более логичным кажется чтение через Stream_IO как

набор Stream_Element, но вот беда, нет гарантии,

что Stream_Element это байт. А вдруг это пол байта,

или два? И в каком они порядке? Читать этим способом

в его общем виде становится жутко неудобно.

 

 

--

Maxim Reznik

Maxim Reznik wrote:

 

Расскажите мне, как правильно читать двоичные файлы.

Например zip-архивы, формат которых описан в терминах

байтов. Или xml-файлы, кодировка которых заранее не

известна (по сути ведь тоже последовательность байт,

значение которых преобразуются в символы после

использования процедуры раскодирования).

 

Самый простой вариант - читать их как поток Character

наверное не есть самый правильный.

 

Точнее - самый неправильный.

 

Более логичным кажется чтение через Stream_IO как

набор Stream_Element, но вот беда, нет гарантии,

что Stream_Element это байт. А вдруг это пол байта,

или два? И в каком они порядке? Читать этим способом

в его общем виде становится жутко неудобно.

 

А почему не через Sequential_IO?

 

Тому точно можно скормить

 

type Octet is mod 2 ** 8;

for Octet'Size use 8;

 

 

--

Vadim Godunko

 

 

 

 

Vadim Godunko п©п╦я┬п╣я┌:

 

Maxim Reznik wrote:

п▒п╬п╩п╣п╣ п╩п╬пЁп╦я┤п╫я▀п╪ п╨п╟п╤п╣я┌я│я▐ я┤я┌п╣п╫п╦п╣ я┤п╣я─п╣п╥ Stream_IO п╨п╟п╨

п╫п╟п╠п╬я─ Stream_Element, п╫п╬ п╡п╬я┌ п╠п╣п╢п╟, п╫п╣я┌ пЁп╟я─п╟п╫я┌п╦п╦, я┤я┌п╬ Stream_Element я█я┌п╬ п╠п╟п╧я┌. п░ п╡п╢я─я┐пЁ я█я┌п╬ п©п╬п╩ п╠п╟п╧я┌п╟, п╦п╩п╦ п╢п╡п╟? п≤ п╡ п╨п╟п╨п╬п╪ п╬п╫п╦ п©п╬я─я▐п╢п╨п╣? п╖п╦я┌п╟я┌я▄ я█я┌п╦п╪ я│п©п╬я│п╬п╠п╬п╪

п╡ п╣пЁп╬ п╬п╠я┴п╣п╪ п╡п╦п╢п╣ я│я┌п╟п╫п╬п╡п╦я┌я│я▐ п╤я┐я┌п╨п╬ п╫п╣я┐п╢п╬п╠п╫п╬.

п░ п©п╬я┤п╣п╪я┐ п╫п╣ я┤п╣я─п╣п╥ Sequential_IO?

 

п╒п╬п╪я┐ я┌п╬я┤п╫п╬ п╪п╬п╤п╫п╬ я│п╨п╬я─п╪п╦я┌я▄

 

type Octet is mod 2 ** 8;

for Octet'Size use 8;

 

п░ Direct_IO я█я┌п╬ п╫п╣ я│я┼п╣я│я┌?

 

--

п║ я┐п╡п╟п╤п╣п╫п╦п╣п╪,

п░п╩п╣п╨я│п╣п╧ п╝. пёп╩п╟я│п╣п╡п╦я┤

(A.STAKANOV)

http://www.livejournal.com/users/a_stakanov/

Aleksey Ulasevich wrote:

 

А Direct_IO это не съест?

 

Direct_IO съест, но эффект будет произвольный ;)

 

Дело в том, что для Direct_IO не обязательно файл будет представляться как последовательность Octet. Дело в том, что если "умной" реализации скармливаешь дискриминантный тип, скажим вида:

 

type S (L : Natural) is record

N : String (1 .. L);

end record;

 

то она может построить индексную таблицу и "уплотнять" файл.

 

И никаких гарантий никто не даёт.

 

 

--

Vadim Godunko

On Mon, Aug 15, 2005 at 09:51:04PM +0400, Vadim Godunko wrote:

 

А почему не через Sequential_IO?

 

Тому точно можно скормить

 

type Octet is mod 2 ** 8;

for Octet'Size use 8;

 

 

Медлено... В Stream_IO можно прочесть сразу массив

любой длины, а в Sequential_IO прийдется читать по

одному байту.

--

Maxim Reznik

Maxim Reznik wrote:

On Mon, Aug 15, 2005 at 09:51:04PM +0400, Vadim Godunko wrote:

 

>А почему не через Sequential_IO?

 

>Тому точно можно скормить

 

>type Octet is mod 2 ** 8;

>for Octet'Size use 8;

 

 

 

Медлено... В Stream_IO можно прочесть сразу массив

любой длины, а в Sequential_IO прийдется читать по

одному байту.

 

Не спорю, но ведь суперпортируемость заказывали? Про эффективность речи не было ;)

 

 

--

Vadim Godunko

On Mon, 15 Aug 2005 20:03:32 +0300, Maxim Reznik <yeo@...> wrote:

 

On Mon, Aug 15, 2005 at 11:53:46AM +0400, Vadim Godunko wrote:

 

Адские средства ввода-вывода даже на сегодняшний день остаются весьма

прогрессивными: они включают и текстовый ввод-вывод, и посделовательный

типизированный, и прямой типизированный, и последовательный поточный

(нетипизированный).

 

 

Расскажите мне, как правильно читать двоичные файлы.

Например zip-архивы, формат которых описан в терминах

байтов. Или xml-файлы, кодировка которых заранее не

 

XML это вроде текст. Причем намекалось что будет

работать через каналы вроде е-майла где и все 8 бит

не всегда проходят...

 

известна (по сути ведь тоже последовательность байт,

значение которых преобразуются в символы после

использования процедуры раскодирования).

 

Самый простой вариант - читать их как поток Character

наверное не есть самый правильный.

 

Более логичным кажется чтение через Stream_IO как

набор Stream_Element, но вот беда, нет гарантии,

что Stream_Element это байт. А вдруг это пол байта,

или два? И в каком они порядке? Читать этим способом

в его общем виде становится жутко неудобно.

 

Ну а двоичные данные вроде zip читать с упором

на машинно-зависимые особенности - как блоки байтов,

например. Причем блоковыми функциями - иначе тормозить

будет жутко.

 

Как раз то место где высокоуровневые средства языка

только мешают. (впрочем в исполнении API SB криворуких

Ц-ников почему-то данные на SB передаются по байтам - руки

бы оторвать этим извращенцам и недоучкам :/ )

 

Но проблем тут нет - такие машино-зависимые куски

в общем-то не большие, дальше уже если надо можно

определить процедуры более высокого уровня уже в любых

более удобных терминах...

 

Терминология.. ну тоесть типы будут уже зависеть от того

в каких терминах пытались писать программу.

 

Vladimir

PS В паскале это ускорялось через процедуры setTextBuf,

увеличивали размер буферов, далее операции через обход

типов... По сравнению с "правильным" посимвольным

чтением быстрее раз в 10 или более. Можно еще через

блоковые операции чтения, но там уже самому всякие текстовые

команды реализовать бы пришлось...

Так что более правильная либа для этого - та которая

учитывает аппаратные особенности и потому быстрее.

-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти