-1

プロジェクトでは、構成されたアセンブリ言語をメモリ ロケーションとオペ コードに変換する必要があります。ファイルを 2 回解析する必要があり、これを行うために strtok() を使用しました。しかし、私のプログラムは 2 番目のループに到達しません。(最初にprintステートメントを入れたので、到達しないと確信しています。)ポインターがファイルの最後にあると思ったので、 rewind(filename) と fseek(filename, 0 を入れてみました。 、SEEK_SET)、しかし、どちらも問題を解決していないようです。何かご意見は?ありがとう。

編集:ここにいくつかのコードがあります(2回目のパスのコード)

j=1, i=0;
/*SECOND PASS*/
fseek(opcode,0,SEEK_SET);
char string[5];
while((fgets(str, buffer, file))!=NULL){/*getting line*/
printf("it got here. yup.");
fputs(memLoc(j-1), opcode); /*inserts the location in memory to file*/
fputs(" ", opcode);/*puts a space in the file*/ 

int state=0; /*state to see if on first or second part of code*/

for(i=0; i<buffer; i++){ /*gets rid of extra new line chars*/
    if(str[i]=='\n'){
    str[i]= '\0';
    break;
    }
}
cp = xerox(str);
token = strtok(cp, delimiters);
printf("%s ",token);
/*if it's not a label, find corresponding opcode and insert into file,
switch state, if it's a label, don't switch state*/
    if((token!=NULL)&&token[strlen(token)-1]!=':'){
        fputs(findOpCode(token), opcode);
        state=1;
    }
    else state=0;

/*if it should be an opcode, insert corresponding opcode into file,
if it should be a location, find and insert where it should be*/
    for (;token = strtok(NULL, delimiters);){
    printf("%s ",token);
        if(token!=NULL)
            if(state==0){
            fputs(findOpCode(token), opcode);
            }

            else if(state==1){
            fputs(locate(token, fIndex), opcode);
            }
        }
    j++;
    fputc('\n', opcode);/*next line*/
}
4

2 に答える 2

2

最初に行うことは、fseek にエラー チェックを追加することです。

if (fseek(opcode,0,SEEK_SET) == -1) {
    perror("fseek");
    exit(1);
}

これにより、より多くの情報が得られるはずです。

于 2012-04-24T01:27:15.587 に答える
1

間違ったファイルを巻き戻していませんか?読み込んで解析しているファイルを巻き戻したくありませんか? その場合、次のようになります。

fseek(file,0,SEEK_SET);
于 2012-04-24T03:21:50.070 に答える