#io #fortran #stdout #stdin #fortran90
#io #fortran #стандартный вывод #stdin #fortran90
Вопрос:
У меня следующая проблема. Я хочу написать программу на Fortran90, которую я хочу иметь возможность вызывать следующим образом:
./program.x < main.in > main.out
В дополнение к «main.out» (чье имя я могу задать при вызове программы), должны быть записаны вторичные выходные данные, и я хотел, чтобы у них было имя, похожее на «main.in » или «main.out» (на самом деле они не называются «main»); однако, когда я использую:
INQUIRE(UNIT=5,NAME=sInputName)
Содержимое sInputName становится «Stdin» вместо имени файла. Есть ли какой-либо способ получить имя файлов, которые связаны с stdin / stdout при вызове программы??
Ответ №1:
К сожалению, смысл перенаправления ввода-вывода заключается в том, что вашей программе не обязательно знать, что это за файлы ввода-вывода. В системах на базе unix вы не можете просматривать аргументы командной строки, поскольку < main.in > main.out
фактически обрабатываются командной оболочкой, которая использует эти файлы для настройки стандартного ввода-вывода перед вызовом вашей программы.
Вы должны помнить, что иногда стандартный ввод и вывод даже не будут файлами, поскольку они могут быть терминалом или каналом. например
./generate_input | ./program.x | less
Итак, одним из решений является перепроектирование вашей программы таким образом, чтобы выходной файл был явным аргументом.
./program.x --out=main.out
Таким образом, ваша программа узнает имя файла. Стоимость заключается в том, что ваша программа теперь отвечает за открытие (и, возможно, создание) файла.
Тем не менее, в системах Linux вы действительно можете найти yout, на который указывают ваши стандартные дескрипторы файлов из специальной файловой системы / proc. Для каждого файлового дескриптора будут установлены символические ссылки
/proc/<process_id>/fd/0 -> standard_input
/proc/<process_id>/fd/1 -> standard_output
/proc/<process_id>/fd/2 -> standard_error
Извините, я не знаю fortran, но способ проверки выходного файла с помощью psudeo-кода может быть:
out_name = realLink( "/proc/" getpid() "/fd/1" )
if( isNormalFile( out_name ) )
...
Имейте в виду, что я сказал ранее, нет гарантии, что на самом деле это будет обычный файл. Это может быть терминальное устройство, канал, сетевой сокет, что угодно… Кроме того, я не знаю, в каких других операционных системах это работает, кроме redhat / centos linux, поэтому это может быть не настолько переносимым. Скорее диагностический инструмент.
Комментарии:
1. 1; Я думаю, если вам нужен такой уровень контроля, то лучше всего передать входное имя программе и заставить программу открыть файл и сгенерировать имена выходных файлов.
Ответ №2:
Возможно, встроенные подпрограммы get_command
и / или get_command_argument
могут помочь. Они были введены в fortran 2003 и либо возвращают полную командную строку, которая использовалась для вызова программы, либо указанный аргумент.