Я довольно долго искал это. Кто-нибудь знает, как очистить экран в консольном приложении на языке Фортран? любая помощь будет очень оценена!
очистить экран на Фортране
Ответы (7)
Фортран, qua Фортран, ничего не знает о таких понятиях, как экраны или клавиатуры или, если на то пошло, компьютеры. Поэтому не существует стандартного для языка способа очистки экрана из Фортрана. Вам придется найти подход, зависящий от платформы.
У большинства компиляторов Fortran есть способ сделать это, например, Intel Fortran предоставляет функцию SYSTEM.
В отличие от других, я бы не стал называть SYSTEM()
(стандартная альтернатива Fortran 2008 — execute_command_line()
), но я бы напечатал правильный escape-код ANSI http://en.wikipedia.org/wiki/ANSI_escape_code:
print *, achar(27)//"[2J"
Это будет намного быстрее, чем вызов SYSTEM()
.
Это работает в типичных терминалах Linux, но не будет работать в терминале MS Windows.
Другой более практичный справочник по использованию escape-кода: http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html
В Fortran 90/95 лучшим вариантом является системная команда, которая является расширением, предоставленным поставщиком (т. е. не являющимся частью стандарта F90/95, поэтому некоторые малоизвестные компиляторы Fortran могут не иметь ее, но все основные имеют).
$ cat clear.f90
program
call system('clear')
end
$ gfortran clear.f90 -o clear
$ ./clear
Это зависит от вашей конкретной системы и компилятора. Общего пути нет. Fortran не знает о конкретных аппаратных устройствах, таких как экраны терминалов и принтеры. (Как и большинство других языков). Детали полностью зависят от вашей конкретной системы.
Я бы посоветовал очистить терминал, вызвав соответствующий скрипт через командную строку, но это нехорошо. обычно более переносимым является запись вывода в обычный текстовый файл, а затем выполнение соответствующих системных команд для вывода этого файла на экран. Таким образом, вы можете манипулировать файлом по своему усмотрению...
См. здесь аналогичный вопрос, из которого были извлечены некоторые из вышеприведенного текста.
В Fortran ACHAR(N)
возвращает ASCII N, поэтому мой предпочтительный метод:
WRITE(*,'(2f15.9,A5)',advance='no') float1,float2,ACHAR(13)
ACHAR(13)
возвращает символ возврата каретки \r
в Python. Поэтому после печати он возвращает курсор в начало строки, где его можно перезаписать.
После того, как вы вышли из цикла, вы можете использовать CALL SYSTEM('clear')
для очистки экрана.
Это полезно, так как CALL SYSTEM('clear')
медленнее и использует много ресурсов процессора, вы можете проверить это, заменив приведенный выше метод на
WRITE(*,'(2f15.9)',advance='no') float1,float2;CALL SYSTEM('clear')
и проверьте разницу во времени, взятом в циклах.
print *, achar(27)//"[2J"
не кажется мне статичным на странице.
- person Shriraj Hegde; 27.10.2020
print *, achar(27)//"[1G"
, но он почти такой же, как ASCII 13, и работает только на некоторых терминалах.
- person Vladimir F; 27.10.2020
clear > clear.txt
? Это работает для меня.
- person Shriraj Hegde; 13.11.2020
Это работает для меня в FTN95
program
call system('CLS')
end
Я нашел еще один способ очистить экран в UNIX-подобных системах, напечатав вывод команды clear
(из руководства по команде очистки, в котором говорится, что вы можете записать вывод в файл, а затем cat
очистить экран)
Так что лучший способ - clear > temp.txt
и использовать символы в файлах в операторе печати
Хотя оба делают одно и то же, вызов SYSTEM(foo) очень-очень (в 100+ раз) медленнее, чем прямая печать этих символов.
Например:
program clear
implicit none
INTEGER::i
do i = 1, 1000
print *, "Test"
call system("clear")
enddo
end program clear
Эта программа занимает от 3,1 до 3,4 секунд.
Но вместо вызова системы, если я напрямую напечатаю символы следующим образом:
program clear
implicit none
INTEGER::i
do i = 1, 1000
print *, "Test"
print *, "[H[2J[3J"
enddo
end program clear
Это дает точно такой же результат, но занимает от 0,008 до 0,012 секунды (от 8 до 12 мс).
На самом деле выполнение второго цикла 100 000 быстрее, чем CALL SYSTEM("clear")
1000 раз.
EDIT: не копируйте и не вставляйте отсюда, это не сработает (символы заменяются в StackOverflow)
Просто используйте clear > file
и скопируйте содержимое файла в оператор печати.
Скриншот фактического кода (из предварительного просмотра):
Эти символы не поддерживаются, я думаю, они исчезают в ответах (они отлично работают в предварительном просмотре)
print *,achar(27) // "[H[2J[3J"
не дает точного результата, как CALL SYSTEM("clear")
- person Shriraj Hegde; 13.11.2020
[2J
.
- person Vladimir F; 13.11.2020
print *,achar(27),"[H",achar(27),"[2J",achar(27),"[3J"
Это работает как задумано
- person Shriraj Hegde; 13.11.2020