无法让fseek在c中使用fgetc

时间:2013-06-26 08:24:35

标签: c fseek fgetc

我正在尝试用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;

}

2 个答案:

答案 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)在最后一次阅读之前备份到该字符。