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

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

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

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

Сообщение chainreaction » 24.03.2009 14:51:59

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

Мне потребовалось чтобы моя программа выводила данные в стандартный вывод, в консоль. Для этого я использую
Код: Выделить всё
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
chainreaction
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.03.2009 14:40:54

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

Сообщение Putnick » 24.03.2009 15:09:55

НУ, не знаю, самое очевидное:
write (OUTPUT,val_num:6:2,#10)
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

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

Сообщение chainreaction » 24.03.2009 15:21:11

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

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

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

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

Сообщение Михаил Крамер » 24.03.2009 15:53:21

Не удалось повторить ваш глюк, хотя тот же компилер, но 32 разряда. А как вы на консоли ентот лишний символ обнаружили?
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

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

Сообщение chainreaction » 24.03.2009 16:40:19

Визуально это так выглядит:
(до и после 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 модулей?

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

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

Сообщение B4rr4cuda » 25.03.2009 18:13:10

Гг, тут половина линуксоиды и бздуны :). Если так уж хочется отказаться от write, можно использовать fpwrite.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

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

Сообщение Putnick » 25.03.2009 19:04:04

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

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

Сообщение chainreaction » 26.03.2009 11:40:16

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

За BlockWrite и fpwrite большое спасибо! Буду экспериментировать.
chainreaction
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.03.2009 14:40:54

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

Сообщение Alexander » 26.03.2009 12:44:29

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

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

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

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

writeln(stderr, val_num:6:2) - на стандартную ошибку.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение B4rr4cuda » 26.03.2009 16:17:27

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

Вывод в OUTPUT, по идее тот же самый стандартный вывод, а вот то что оно неправильно работает - это уже бага. Понятно, что обычно так не делается, но если необходимо выводить данные в разные потоки, то эта возможность имеет право на существование, дабы не запутаться.
ЗЫ: От оскорблений попрошу воздержаться.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

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

Сообщение Михаил Крамер » 26.03.2009 17:57:53

Эм.... может быть это глюк только 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.
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

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

Сообщение chainreaction » 27.03.2009 10:19:44

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

Что-то я сам там такого напортачил там, что появились лишние символы.
chainreaction
незнакомец
 
Сообщения: 5
Зарегистрирован: 24.03.2009 14:40:54


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru