Глюк writeln под Linux с EOL ?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
chainreaction
незнакомец
Сообщения: 5
Зарегистрирован: 24.03.2009 13:40:54

Глюк writeln под Linux с EOL ?

Сообщение chainreaction »

Здравствуйте!

Мне потребовалось чтобы моя программа выводила данные в стандартный вывод, в консоль. Для этого я использую

Код: Выделить всё

writeln(OUTPUT,val_num:6:2) 

в цикле.

Первые 25 значений выводятся нормально с UNIX символом EoL (0x0A), однако после 25 значения почему-то строки начинают заканчиваться DOS EoL (0x0D, 0x0A).

Был бы признателен за совет как все же выводить всё в UNIX стиле.

Free Pascal Compiler version 2.2.0 [2008/09/20] for x86_64 работаю в Ubuntu 8.10
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

НУ, не знаю, самое очевидное:
write (OUTPUT,val_num:6:2,#10)
chainreaction
незнакомец
Сообщения: 5
Зарегистрирован: 24.03.2009 13:40:54

Сообщение chainreaction »

К сожалению тот же результат. В консоли отображаются лишние ^M после 25 строки.

Может ли это быть связано с насторйками терминала? 25 строк это, если не ошибаюсь, стандарный размер TTY.

Спасибо.
Михаил Крамер
новенький
Сообщения: 73
Зарегистрирован: 08.02.2008 13:26:40

Сообщение Михаил Крамер »

Не удалось повторить ваш глюк, хотя тот же компилер, но 32 разряда. А как вы на консоли ентот лишний символ обнаружили?
chainreaction
незнакомец
Сообщения: 5
Зарегистрирован: 24.03.2009 13:40:54

Сообщение chainreaction »

Визуально это так выглядит:
(до и после 25 строки)

Код: Выделить всё

160.00
  0.00
160.00
  0.00
160.00
  0.00
160.00
^M  0.00
^M 80.00
^M  0.00
^M 80.00
^M  0.00
^M160.00
^M  0.00


Ну и конечно, если перенаправить всё в текстовый файл, то байты можно просмотреть HEX-редактором.

Добавлено спустя 22 часа 49 минут 35 секунд:
Putnick !
Раз уж вы тоже линуксоид :D
Не подскажите ли, можно как-то заменить write/writeln процедурами из других, специфических для linux модулей?

Спасибо!
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Гг, тут половина линуксоиды и бздуны :). Если так уж хочется отказаться от write, можно использовать fpwrite.
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

Уважаемый Chainreactor,
с глубоким прискорбием должен сообщить Вам, что не являюсь линуксоидом (хотя и присматриваюсь этой системе, время от времени сбиваясь на нецензурные выражения).
Совет же давал из того соображения, что, по логике, если "неправильный" WriteLn эквивалентен Write (File, 'something',#10,#13), то "правильный" WriteLn эквивалентен Write (File, 'something',#10).
Однако, если уж при выводе в текстовый файл появляются дополнительные символы, то, думается, есть повод оповестить об этом всё прогрессивное человечество через bug-tracer.
Ещё одна мысль, изврат, конечно, но: а что если писать в файл напрямую: BlockWrite(File, String[1], Length(String))? Тогда уж точно в файле будет только то, что ты туда положил.
chainreaction
незнакомец
Сообщения: 5
Зарегистрирован: 24.03.2009 13:40:54

Сообщение chainreaction »

Я немного неточно выразился про запись в файл.
Если делать вывод не в специальный файл OUTPUT, а в обычный, связанный с файловой переменной file: writeln(file, x), то внутри этого файла как-раз все как надо.
Лишний символ появляется лишь когда вывод идет в терминал.

За BlockWrite и fpwrite большое спасибо! Буду экспериментировать.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 864
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Чего то тут не то происходит. Совсем ресурс деградирует.

Зачем писать OUTPUT ? А ? Какого хрена ?

writeln(val_num:6:2) и всё. Это и будет стандартный вывод на консоль.

А если хочется куда нибудь ещё, то имена (насколько помню) другие.

writeln(stderr, val_num:6:2) - на стандартную ошибку.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Alexander писал(а):writeln(val_num:6:2) и всё. Это и будет стандартный вывод на консоль.

Вывод в OUTPUT, по идее тот же самый стандартный вывод, а вот то что оно неправильно работает - это уже бага. Понятно, что обычно так не делается, но если необходимо выводить данные в разные потоки, то эта возможность имеет право на существование, дабы не запутаться.
ЗЫ: От оскорблений попрошу воздержаться.
Михаил Крамер
новенький
Сообщения: 73
Зарегистрирован: 08.02.2008 13:26:40

Сообщение Михаил Крамер »

Эм.... может быть это глюк только 64-разрядной версии, поскольку у меня на ASP Linux 11.2, fpc2.2.0 всё в порядке, никаких ^M нет и в помине... Вот прога, которой я проверял:

Код: Выделить всё

var i: Byte;
begin
  for i:=1 to 500 do
        Writeln(output, real(i):6:2);
end.
chainreaction
незнакомец
Сообщения: 5
Зарегистрирован: 24.03.2009 13:40:54

Сообщение chainreaction »

Хммм. Похоже, что ошибка именно в моей программе. Просто тест, как предложил Михаил выполнить, мне в голову сделать до этого не приходило. Но сейчас попробовал тест и оказалось, что никаких ^M нет. Так что с коспилятором скорее всего все в порядке.

Что-то я сам там такого напортачил там, что появились лишние символы.
Ответить