2011-10-20 20 views
9

Actualmente, estoy usando la línea de comandos shell de las llamadas desde mi programa FORTRAN que utilizan el sistema no estándar rutina intrínseca (similar a Fortran 2008 EXECUTE_COMMAND_LINE intrínseca):Ejecutar línea de comandos y devolver la salida del comando

CALL SYSTEM(commandStr) 

donde commandStr es una cadena de caracteres que contiene el comando de shell que quiero ejecutar. Por el momento, no conozco una forma directa de devolver la salida de commandStr, sino solo su estado de retorno. Entonces, lo que estoy haciendo ahora es escribir el resultado en un archivo y luego leer el archivo desde el programa Fortran. Ejemplo:

CALL SYSTEM('sed ''s/,//g'' myFile > dummyFile') 

si deseo eliminar las comas de myFile. Luego uso OPEN y READ para obtener los contenidos de dummyFile.

Esto funciona bien, sin embargo, me preocupa escribir/leer archivos del disco, especialmente si estaba haciendo esto en un bucle largo, y si la salida de commandStr era grande. ¿Hay alguna manera de redirigir la salida de CommandStr a un búfer de memoria (no a un disco duro) al que podría acceder directamente desde mi programa Fortran (quizás a través de un número específico de UNIT)?

+0

Si la salida fue grande, ¿no tendría más sentido guardarla en un archivo? – Rook

+0

Supongo que no marcaría la diferencia para el código; la única parte que me preocupa aquí es que las E/S frecuentes hacia y desde el disco afectan la eficacia del programa. ¿Hay alguna razón por la cual sería mejor almacenarlo en un archivo, algo que me falta? – milancurcic

+1

Bueno, desde mi punto de vista, es solo un problema de practicidad. Si no se trata de una gran cantidad de datos, guardarlos en un archivo no importará. Se trata de una gran cantidad de datos, y lo estoy reutilizando en el programa en ejecución actual, el último lugar donde lo quiero es la memoria. Necesito memoria para almacenar los resultados de "analizar" ese archivo, y luego hacer algo con eso. Esto podría haber sido mejor explicado, pero creo que entiendes la idea. – Rook

Respuesta

1

Si esto está en un entorno POSIX, la función de biblioteca popen() también podría estar disponible.

iunit = popen ('sed ''s/,//g'' myFile', 'r') 

vistazo a la documentación para su entorno Fortran, ya que no estoy seguro de la semántica para la conexión de la E/S de Fortran. Si es como la biblioteca de tiempo de ejecución de C, la conexión de archivo también necesita una función especial para cerrarla, pclose().

+1

Puede usar el material de Posix a través de la ISO_C_Binding, hay un proyecto relacionado con eso en: http://sourceforge.net/projects/fortranposix/ – haraldkl

Cuestiones relacionadas