하스켈에서 Brainfuck 인터프리터를 작성했지만 EOF를 알리기 위해 Ctrl-D를 누르면 입력에 대해서만 작동합니다. 각 문자를 입력 할 때 프로그램을 어떻게 작동시킬 수 있습니까?하스켈에 입력했을 때 어떻게 입력 할 수 있습니까?
Here이 소스입니다. 프로그램을 사용하려면 인수로 해석 할 파일을 지정하거나 stdin의 첫 번째 행에 프로그램을 입력하십시오.
하스켈에서 Brainfuck 인터프리터를 작성했지만 EOF를 알리기 위해 Ctrl-D를 누르면 입력에 대해서만 작동합니다. 각 문자를 입력 할 때 프로그램을 어떻게 작동시킬 수 있습니까?하스켈에 입력했을 때 어떻게 입력 할 수 있습니까?
Here이 소스입니다. 프로그램을 사용하려면 인수로 해석 할 파일을 지정하거나 stdin의 첫 번째 행에 프로그램을 입력하십시오.
입력이 버퍼링되는 것처럼 들립니다. System.IO.hSetBuffering
을 사용하여 파일 핸들의 버퍼링 모드를 수정할 수 있습니다. (처음에`getLine`와 거짓말을하지 않습니다
import System.IO
hSetBuffering stdin NoBuffering
getLine
사용자가 줄 바꿈 문자 (\n
)를 입력 할 때까지 대기합니다. 사용자가 여러 줄 문자를 입력했지만 한번도 입력하지 않았습니까? "라인"이 결국 라인이 아니면 "라인"의 일부가 이미 처리 되었다면 오류가 발생합니다.
대신 터미널에서 입력 한 모든 내용을 반환하는 getContents
을 사용해야합니다.
또한, 다음 줄을 사용하고 있습니다 :
then hGetContents =<< openFile (head args) ReadMode
이 파일을 열고 닫습니다하지 않습니다. 이것은 짧은 프로그램에서도 괜찮지 만 나중에 익숙해지는 것이 더 좋은 생각 일 수 있습니다.
then readFile $ head args
문제가 아니라 끝 부분'getChar'과 : 사용자가 표준 입력을 읽고있는 경우, 예를 들어, 당신은으로 버퍼링을 해제 할 수 'exec' 함수에서). – dlahoti
나는 이것을 시도했지만, 입력에 응답하기 전에 Ctrl-D를 누르기 전까지 기다렸다. – dlahoti
'stdout'의 버퍼링 모드를'NoBuffering'으로 변경하여 그 문제를 해결했습니다. – dlahoti