1

我正在尝试用 c 编写一个笨拙的解释器,但我无法让 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;

}

4

2 回答 2

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;
}
于 2013-06-26T08:33:51.907 回答
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)在最后一次阅读之前备份到该字符。

于 2013-06-28T07:14:41.240 回答