현재 Java에서 내 Brainfuck 인터프리터를 작성하고 있으며 파일에서 코드를 읽을 수 있기 때문에 불필요한 기호를 필터링하는 BFInputStream
을 작성했습니다. 그것은 다음과 같습니다기본 스트림이 0 바이트를 반환했습니다.
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.IOException;
public class BFInputStream extends FilterInputStream {
public BFInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
while(true) {
int i = super.read();
// keep LF for line number checking.
if(i == -1 || i == 10 ||(i >= 43 && i <= 46) || i == 60 || i == 62 || i == 91 || i == 93)
return i;
}
}
public int read(byte[] b, int off, int len) throws IOException {
if(off < 0 || len < 0 || len > b.length - off) throw new IndexOutOfBoundsException();
for(int i=0; i<len; i++) {
int j = read();
if(j < 1) return i;
b[off+i] = (byte)j;
}
return len;
}
}
내 통역이 LineNumberReader
< 사용 - 파일을 읽을 수 FileInputStream
- InputStreamReader
<-BFInputStream
<합니다.
때 java.io.IOException :하지만 매번 그것이 발생 파일의 끝에 도달 기본이되는 입력 스트림 Interpreter.java:101이
BFInputStream.read()
에 대한 호출을 포함at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.read(BufferedReader.java:157) at java.io.LineNumberReader.read(LineNumberReader.java:108) at Interpreter.run(Interpreter.java:101) at Interpreter.main(Interpreter.java:180)
0 바이트 돌아왔다.
예외를 올바르게 이해하는지 잘 모르겠습니다. 나는 스트림이 전혀 바이트를 반환하지 않았다고 생각한다 (타임 아웃 때문에). BF가 아닌 문자의 거대한 덩어리가 있다면 가능 하겠지만 파일의 끝에 있습니까? FileInputStream
이므로 FilterInputStream
및 BFInputStream
은 -1을 반환해야합니다.
내 코드에 어떤 문제가 있습니까?
Exept 당신이 캐스팅 잊었 : 나는 파일에 쓰기 위해 파일
에서 독서를 들어 그것을
시도 ... 당신에게 내가 지침으로 사용하는 코드의 조각을주고있다 'j'는 바이트로 완벽하게 작동합니다. 고마워요. 나는 -1에 대한 수표를 추가하는 것을 잊어 버렸다. 그러나 나는 0 대신에 1이 어떻게 거기에 왔는지 전혀 모른다. – IchBinKeinBaum
@IchBinKeinBaum : 첫 번째 반복에서 EOF를 얻으면 코드에서 0을 생성합니다. – axtavt
예 알아 차렸습니다. 내가 의미하는 바는'if (j <0)'대신'if (j <1)'을 쓰는 이유를 모르겠다. – IchBinKeinBaum