2014-09-22 3 views
1

В C Я могу использовать стандартную функцию freopen с stdout, чтобы перенаправить стандартный вывод моей программы в файл. Я хотел бы сделать то же самое с fortran, но после того, как я нашел googled, я не смог найти подобную функцию. Он существует?Fortran эквивалент freopen

В случае, если кто-то задается вопросом, что мой вариант использования, и почему я не могу просто перенаправить вывод с помощью оболочки, я запускаю программу MPI и вам нужно перенаправить вывод каждого экземпляра в другой файл. Я не могу делать это из-за пределов программы, поскольку реализация MPI у нас не позволяет этого сделать.


EDIT: Смежный вопрос заключается в следующем. Скажем, что код fortran вызывает функцию C, и эта функция C вызывает freopen stdout в другой файл. Что происходит с последующими write(*,*), print * и write(6,*) в fortran? Является ли выход этих перенаправленных в файл или нет?

+1

Что касается вопроса, который вы добавили - что вы узнали, когда попробовали это? –

+0

Хорошо, что я выяснил, совершенно не имеет значения, так как мне нужна переносимость, а переносимость обеспечивается стандартами. Мне, вероятно, нужно знать, как обрабатываются дескрипторы файлов в соответствии со стандартом Fortan, но я не уверен, какие последствия могут быть. Однако вы заслуживаете ответа ... Да, это сработало. Все последующие выходные данные были перенаправлены в файл, как и ожидалось. – Spiros

ответ

2

Если вы предусмотрительно, чтобы написать все ваши write заявления по линиям

write(write_unit,*) stuff_to_write 

это было бы очень просто, вы можете просто прикрепить write_unit к файлу вместо stdout. Наверное, вы уже это знали, или вы не задали бы вопрос. Если write утверждения формы

write(*,*) 

или

print * 

, то вы, вероятно, может перенаправить вывод с небольшой помощью вашего компилятора. Например, Intel Fortran отправляет выходные данные на адрес * на консоль, если только программа не обнаруживает себя в среде с переменной FOR_PRINT, установленной на имя какого-либо файла или другого файла, и в этом случае write(*,*) будет записывать в этот файл. Я ожидаю, что другие компиляторы имеют схожие возможности.

Если ваш код использует

write(6,*) 

на предположении, что блок 6 очков в stdout вы можете открыть блок 6 на файл

open(unit = 6, file = 'stdout_redirect', status = 'new') 

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

EDIT

после редактирования OP на вопрос. Это скорее комментарий, чем ответ, но я довольно длинный ...

К сожалению, с точки зрения переносимости большая часть взаимодействия программы Fortran с базовой компьютерной системой не определена в стандартах , Ваш вопрос о том, где идет вывод, отправленный в блок * go, является примером; в последнем (2008 г.) стандарте говорится, что он должен перейти в тот же блок, который идентифицируется с помощью именованной константы output_unit из внутреннего модуля iso_fortran_env. Но он не говорит, что он идет до stdout (было много реализаций Fortran в системах без stdout), и он не указывает, как перенаправить этот вывод, или даже если это возможно. Перенаправление вывода - это вопрос для платформы, а не Fortran.Как мы обнаружили, Intel Fortran может использовать переменную окружения для перенаправления вывода, видимо, Cray Fortran не может.

Последний стандарт полностью умалчивает о дескрипторах файлов, я не уверен, что это концепция, известная Fortran.

Использование * для ввода/вывода в основном говорит о том, что это зависит от системы компилятора/времени выполнения, откуда поступает вход и выход. Если вам нужна переносимость, вам нужно взять управление и использовать определенную идентификацию устройства. Лично я думаю, что вы должны принять совет @ george в комментарии ниже.

+2

Если у вас не было предвидения использования переменной для номера устройства, укусите пулю и верните ее и исправьте. Все остальное задает проблемы в mpi. – agentp

+0

Ну, довольно @george. И спасибо за то, что я сделал что-то, что я бы не подумал сделать явным. –

+0

Большое спасибо за ваши намеки. Кодовая база, с которой я работаю, довольно большая (порядка 50 тыс. Строк) и очень разнородная с точки зрения стиля и практики. Не существует общего соглашения о том, как печатать вещи, главным образом потому, что на стандартный вывод печатаются только диагностические сообщения (а диагностические сообщения считаются мало релевантными). Я вижу ваши решения и думаю, что ни один из них не подходит для моего дела, потому что нет стандартного способа сделать это. Составителями, на которых я настроен таргетинг, являются GCC и Cray. – Spiros