2011-10-20 8 views
9

Attualmente, sto usando riga di comando di shell chiama dal mio programma FORTRAN utilizzando SISTEMA non standard di routine intrinseca (simile a Fortran 2008 EXECUTE_COMMAND_LINE intrinseca):Esegui riga di comando e restituire l'output del comando

CALL SYSTEM(commandStr) 

dove commandStr è un stringa di caratteri contenente il comando shell che voglio eseguire. Al momento, non sono a conoscenza di un modo diretto per restituire l'output di commandStr, ma solo il suo stato di ritorno. Quindi, quello che sto facendo ora è scrivere l'output in un file e quindi leggere il file all'interno del programma Fortran. Esempio:

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

se voglio rimuovere le virgole da myFile. Quindi utilizzo OPEN e READ per ottenere il contenuto di dummyFile.

Questo funziona bene, tuttavia sono preoccupato per la scrittura/lettura di file dal disco, soprattutto se stavo facendo questo in un lungo ciclo, e se l'output di commandStr era grande. C'è un modo per reindirizzare l'output di CommandStr in un buffer di memoria (non un hard disk) al quale potrei accedere direttamente dal mio programma Fortran (magari attraverso uno specifico numero di UNIT)?

+0

Se l'output era grande, non avrebbe più senso memorizzarlo in un file? – Rook

+0

Immagino che non farebbe la differenza per il codice - l'unica parte che mi preoccupo qui è l'I/O frequente da e verso il disco che influenza l'efficienza del programma. C'è un motivo per cui sarebbe meglio archiviarlo in un file, qualcosa che mi manca? – milancurcic

+1

Bene, dal mio punto di vista è solo un problema di praticità. Se non ci sono molti dati, non è importante memorizzarli in un file. Sono molti dati e lo sto riutilizzando nel programma corrente, l'ultimo posto in cui voglio che sia la memoria. Ho bisogno di memoria per archiviare i risultati di "analizzare" quel file e poi fare qualcosa con quelli. Probabilmente sarebbe stato meglio spiegarlo, ma penso che tu abbia avuto l'idea. – Rook

risposta

1

Se questo è in un ambiente POSIX, potrebbe anche essere disponibile la funzione libreria popen().

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

consultare la documentazione per il proprio ambiente Fortran dal momento che non sono sicuro della semantica per il collegamento di I/O a Fortran. Se è come la libreria di runtime C, la connessione al file richiede anche una funzione speciale per chiuderla, pclose().

+1

Si può usare la roba di Posix attraverso la ISO_C_Binding, c'è un progetto che riguarda quello all'indirizzo: http://sourceforge.net/projects/fortranposix/ – haraldkl