Почему вывод Fortran имеет начальный пробел?

Я обрабатываю множество выходных данных программ на Фортране, и обычно оказывается, что выходные данные этих программ имеют начальный пробел, т. е. столбец символов 1 пуст. Рассмотрим короткую программу leading.f:

      program leading
      print *, "<-- What's that space for?"
      end program leading

Имеет вывод

 <-- What's that space for?

(да, в начале есть один пробел). Мой вопрос содержится в программе.


person Mike T    schedule 16.05.2012    source источник
comment
Не имея ответа на вопрос, для чего это нужно, вот как подавить его, если вы этого хотите: используйте строковый форматированный вывод вместо неформатированного: write(*,"(A)")"a space, really?"   -  person ev-br    schedule 17.05.2012
comment
Лучше всего объяснить здесь реализовано в компиляторах">stackoverflow.com/questions/3296237/   -  person Rook    schedule 17.05.2012


Ответы (2)


Еще в эпоху динозавров, когда выходные данные FORTRAN обычно отправлялись на ударный принтер с зеленой полосой, определенные символы в первом столбце печати часто интерпретировались как управляющие коды (перевод строки, перевод страницы и т. д.). Многие программисты научились явно очищать столбец 1 своего вывода, если только не предполагался какой-то особый эффект — а старые привычки не умирают!

person Jim Lewis    schedule 16.05.2012

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

Fortran сам удалил концепцию управления кареткой в ​​Fortran 2003, но для полноты картины мы можем видеть, что Fortran по-прежнему требует, чтобы вывод, ориентированный на список, имел (в большинстве случаев) это (по умолчанию) начальный пробел (Fortran 2018, 13.10.4 p.13):

За исключением новых записей, созданных явным форматированием в рамках определенной процедуры вывода или продолжением последовательностей символов с разделителями, каждая выходная запись начинается с пустого символа.

Форматирование списка имен имеет аналогичный оператор.

Вы можете избежать этого начального пробела, избегая использования вывода, ориентированного на список:

print '(A)', '<-- No space here'
end

Обратите внимание, что здесь виноват не print, а вывод, ориентированный на список. Аналогичное мы видим с write:

write (*,*) '<-- Space from the list-directed output'
end

Наконец, если мы используем внутренние файлы, мы все равно получим начальный пробел с выводом, ориентированным на список:

character(len=20) :: internal
write (internal, *) '<-- Leading blank here'
end

(Если мы затем выведем этот внутренний файл со списком, мы увидим два начальных пробела.)

person francescalus    schedule 01.02.2021