2009-11-14 8 views
5

estoy usando ghci 6.10.4 en la línea de comando del DOS en XP, y también en emacs usando Haskell-mode-2,4¿Cómo hacer que la entrada estándar ruta de un archivo a una función cuando se ejecuta GHCi

Al ejecutar programas que operan en stdin, ¿hay alguna manera de redirigir un archivo para que sea stdin? Por ejemplo, si tengo una función llamada main que lee de la entrada estándar, no puedo hacer:

*Main> main < words.txt 

¿Hay otra manera?

También me gustaría poder escribir stdin en la ventana ghci, que parece funcionar, pero ¿qué es la clave EOF? Pensé que era Ctrl-D, pero eso no funciona.

+3

Creo en dos/windows Ctrl-Z es la tecla EOF ... – Suppressingfire

+0

Ah sí. Intenté eso y pensé que no, pero de hecho funciona, pero como dice la respuesta a continuación, también cierra stdin y aparece un mensaje de error como: * Main>: hLookAhead: argumento no válido (descriptor de archivo incorrecto) – justinhj

Respuesta

6

Esto será más fácil si retrabaja su main para abrir el archivo.

import System.Environment 
import System.IO 

main :: IO() 
main = do 
    args <- getArgs 
    case args of 
     [] -> doStuff stdin 
     file:_ -> 
     withFile file ReadMode doStuff 

doStuff :: Handle -> IO() 
doStuff = … 
 
*Main> System.Environment.withArgs ["main.txt"] main 

no da una EOF en stdin mientras que dentro de GHCi. Si lo hace, todos los intentos posteriores para leer de la entrada estándar fallará:

 
Prelude> getLine 
*** Exception: <stdin>: hGetLine: illegal operation (handle is closed) 
Prelude> getContents 
*** Exception: <stdin>: hGetContents: illegal operation (handle is closed) 
+0

Gracias, eso es útil. – justinhj

+0

En Cygwin, CTRL + C parece cancelar una operación mientras también cierra el identificador de archivo? ¿Cómo se cancela la operación sin cerrar el mango? – CMCDragonkai

3

se puede escribir: principal en GHCi para invocar los parámetros de línea de comandos. Me temo que probablemente solo quieras usar eso.

+1

+1 Whoa, ¿cuándo agregaron eso? Eso es definitivamente más corto que '... withArgs ...' – ephemient

+3

Eso es práctico, pero no se puede redirigir stdin así: : main justinhj

+1

Lo siento efusivo, pero no he usado haskell por mucho tiempo, así que ha estado aquí siempre y cuando Puedo recordar. Y justinhj, ¿por qué no probar esto? main = do {args <- getArgs; let file = head args; contenido <- readFile archivo; hPutStr stdin contenido; ...} Entonces puedes hacer: main words.txt – codebliss

Cuestiones relacionadas