1

C でブレイン インタープリターを作成しようとしていますが、fseek を動作させることができません。何が間違っているのかわからないので、可能であれば fseek を使い続けたいと思います。fgetc を使用して各ブレインファック文字を個別にチェックし、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

呼び出す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 に答える
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 に答える