我正在尝试用c编写一个brainfuck解释器,但我无法让fseek工作。我不确定我做错了什么,如果可能的话我宁愿继续使用fseek。我正在使用fgetc单独检查每个brainfuck字符,并使用x来保存fgetc的值。这是代码:
#include <stdio.h>
main(int argc, char *argv[]){
argc--; argv++;
char array[3000];
char *program = array;
int yo = 0;
fpos_t pos;
FILE *fp;
if(*argv != NULL){
fp = fopen(*argv,"rb");
int x;
int z = 1;
while(z){
x = fgetc(fp);
if(x == 62){
++program;
}else if(x == 60){
--program;
}else if(x == 43){
++*program;
}else if(x == 45){
--*program;
}else if(x == 46){
putchar(*program);
}else if(x == 44){
*program=getchar();
}else if(x == 93){
if(*program != 0){
int yo = 1;
while(yo){
fseek(fp, -1, SEEK_CUR);
if(fgetc(x) == 93){
putchar(93);
yo++;
}else if(fgetc(x) == 91){
putchar(91);
yo--;
}
}
}
}else if(x == EOF){
break;
}
}
fclose(fp);
}else{
printf("Error: no input file.\n");
}
return 0;
}
答案 0 :(得分:0)
这是工作代码(很明显,评论将是多余的):
#include <stdio.h>
int main(){
char array[3000];
char *program = array;
FILE *fp = NULL;
fp = fopen("hi.txt","rb");
if ( fp == NULL)
printf("Error: no input file.\n");
int x = 0;
int size;
while(1){
char c = fgetc(fp);
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
char j[size];
fscanf(fp, "%s", j);
if(j[x] == 62){
++program;
} else if(j[x] == 60){
--program;
} else if(j[x] == 43){
++*program;
} else if(j[x] == 45){
--*program;
} else if(j[x] == 46){
putchar(*program);
} else if(j[x] == 44){
*program=getchar();
} else if(j[x] == 93){
if(*program != 0){
int yo = 1;
while(yo){
x--;
if(j[x] == 93)
yo++;
else if(j[x] == 91)
yo--;
if(yo == 0)
break;
}
}
} else if(j[x] == EOF){
break;
}
x++;
}
fclose(fp);
return 0;
}
答案 1 :(得分:0)
当你致电fgetc(fp)
时,它会读取一个字符并提前当前指针,所以下一次读取将会读取下一个字符。所以当你这样做时:
while(yo) {
fseek(fp, -1, SEEK_CUR);
if(fgetc(fp) == 93) {
putchar(93);
yo++; }
你备份一个角色,然后阅读你刚刚备份的角色,超越它。所以你最终循环,永远读取完全相同的字符,至少直到yo
溢出并回绕到0(这可能永远不会发生,因为整数溢出在C中是未定义的。)
您可能实际上希望fseek(fp, -2, SEEK_CUR)
在最后一次阅读之前备份到该字符。