2012-03-28 4 views
1

하스켈에서 Brainfuck 인터프리터를 작성했지만 EOF를 알리기 위해 Ctrl-D를 누르면 입력에 대해서만 작동합니다. 각 문자를 입력 할 때 프로그램을 어떻게 작동시킬 수 있습니까?하스켈에 입력했을 때 어떻게 입력 할 수 있습니까?

Here이 소스입니다. 프로그램을 사용하려면 인수로 해석 할 파일을 지정하거나 stdin의 첫 번째 행에 프로그램을 입력하십시오.

답변

3

입력이 버퍼링되는 것처럼 들립니다. System.IO.hSetBuffering을 사용하여 파일 핸들의 버퍼링 모드를 수정할 수 있습니다. (처음에`getLine`와 거짓말을하지 않습니다

import System.IO 

hSetBuffering stdin NoBuffering 
+0

나는 이것을 시도했지만, 입력에 응답하기 전에 Ctrl-D를 누르기 전까지 기다렸다. – dlahoti

+1

'stdout'의 버퍼링 모드를'NoBuffering'으로 변경하여 그 문제를 해결했습니다. – dlahoti

1

getLine 사용자가 줄 바꿈 문자 (\n)를 입력 할 때까지 대기합니다. 사용자가 여러 줄 문자를 입력했지만 한번도 입력하지 않았습니까? "라인"이 결국 라인이 아니면 "라인"의 일부가 이미 처리 되었다면 오류가 발생합니다.

대신 터미널에서 입력 한 모든 내용을 반환하는 getContents을 사용해야합니다.

또한, 다음 줄을 사용하고 있습니다 :

then hGetContents =<< openFile (head args) ReadMode 

이 파일을 열고 닫습니다하지 않습니다. 이것은 짧은 프로그램에서도 괜찮지 만 나중에 익숙해지는 것이 더 좋은 생각 일 수 있습니다.

then readFile $ head args 
+0

문제가 아니라 끝 부분'getChar'과 : 사용자가 표준 입력을 읽고있는 경우, 예를 들어, 당신은으로 버퍼링을 해제 할 수 'exec' 함수에서). – dlahoti

관련 문제