读取MIPS指令的C程序出错,输出带行号的文件和摘要

时间:2016-11-23 23:40:05

标签: c mips

问题:使用c程序读取MIPS指令文件,将其输出到第二个文件(两个都是命令行参数),其中包含MIPS文件的内容和行号。下半部分应该显示一个交叉引用表,它详细说明了标识符,定义(一个数字)以及该标识符的用法(按行号),用于多次使用的任何标识符。

不幸的是,我已经搁浅了,程序不仅似乎没有实际打印任何东西,但它似乎也没有制作任何文件。这是一个最后的努力,看看是否有其他人可以帮助我。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*Func line takes in a file, and places a line number at the beginning of every
non blank line */

void line(FILE *input, FILE *output) {  
    char a, c;
    int lineNum = 0;
    int startOfLine = 1;
    char ch;
    fprintf(output, "%d  ", ++lineNum);

    //copy the contents of the input file into the output file
    do {
        a = fgetc(input);
        fputc(a, output);
        c = getc(input);
        if(a == '\n' && c != '\n') {
            if(lineNum > 9) 
                fprintf(output, "%d  ", ++lineNum);
            else 
                fprintf(output, "%d   ", ++lineNum);
        }
        ungetc(c, input);
    } while (a != EOF);
    printf("ran line: \n");
}

/* Func cross takes in a file, and finds each identifier, marks its definition, and every
use and returns that in the output file */

void cross(FILE *input, FILE *output) { 
    FILE *temp = fopen("temp.txt", "a+"); 
    int lineNum = 0;
    int startOfLine = 1;
    char identifier[20][10];
    char a, c, i;
    int j, k, p;
    int size=0;
    int def[20];
    int use[20][50];
    char tempstr[80];
    fprintf(output, "Identifier\tDefinition\t  Use\n");

    fprintf(temp, "%d   ", ++lineNum);
    //copy contents of input into a temp file
    do {
        a = fgetc(input);
        fputc(a, temp);
        c = getc(input);
        if(a == '\n' && c != '\n') {
            if(lineNum > 9) 
                fprintf(temp, "%d  ", ++lineNum);
            else 
                fprintf(temp, "%d   ", ++lineNum);
        }
        ungetc(c, input);
    } while (a != EOF);

    fclose(temp);
    fopen("temp.txt", "r");

    j=0;

    //checks to see if current line has an Identifier and if so saves it to an array
    //along with the line number it was defined on
    while(fgets(tempstr, 80, temp)) {
        if(isalpha(tempstr[4]) || tempstr[4] == '_') {
            sscanf(tempstr, "%d   %[0-9_A-Z_a-z_]", &def[j], identifier[j]);
            j++;
            size++;
        }
    }

    fclose(temp);
    fopen("temp.txt", "r");

    //checks for each identifier, on every line whether or not that identifier is used 
    while(fgets(tempstr, 80, temp)) {
        char *tempNum;
        sscanf(tempstr, "%s", tempNum);
        int tempN = atoi(tempNum);
        int n;
        p=0;
        for(n=0; n<size; n++) {
            if(strstr(tempstr, identifier[n]) && tempN > def[n] && tempstr[4] != '#') { 
                use[n][p] = tempN;
                p++;
            }
        }
    }

    //writes the identifier, definition, and uses to the file
    for(k=0;k<size;k++) {
        fprintf(output, "%s\t\t   %d\t\t  ", identifier[k], def[k]);
        for(p=0; p<50; p++) {
            if(use[k][p] != NULL && use[k][p] < lineNum && use[k][p] > def[k])
                fprintf(output,"%d ", use[k][p]);
        }
        fprintf(output, "\n");
    }
    printf("ran cross: \n");
} 

/*Func both returns the file with numbered lines and a cross reference table at the bottom of the file */

void both(FILE *input, FILE *output, char *outputName) {    
    FILE *lineFile = fopen("line.txt", "a+");
    FILE *crossFile = fopen("cross.txt", "a+");
    char ch;
    line(input, lineFile);
    cross(input, crossFile);
    while( (ch = fgetc(lineFile)) != EOF)
        fputc(ch, output);
    fprintf(output, "\n\t\t\tCross Reference Table\n");
    while( (ch = fgetc(crossFile)) != EOF)
        fputc(ch, output);
    fclose(output);
    printf("ran both: \n");
} 

int main(int argc, char * argv[]) {
    FILE *input, *output;
    output = fopen(argv[4], "a+"); 
    char outputName[50];
    strcpy(outputName, argv[4]);

    //Error testing
    if(argc > 5)
        exit(1);
    if(strcmp(argv[2], "-l") != 0 && strcmp(argv[2], "-c") != 0 && strcmp(argv[2], "-b") != 0) { 
        printf("Incorrect flag syntax... Exiting\n");
        exit(1);
    }
    if((input = fopen(argv[3], "r+")) == NULL) { 
        printf("Input file could not be opened... Exiting\n");
        exit(1);
    }
    else {
        if(strcmp(argv[2], "-l") == 0) {
            line(input, output);
        }
        else if(strcmp(argv[2], "-c") == 0) 
            cross(input, output);
        else {
            both(input, output, outputName);
        }
    } 
    printf("ran main: \n");

    return 0;
}

0 个答案:

没有答案