использование fscanf для чтения файла помещает 0 @ в первую строку - PullRequest
0 голосов
/ 19 ноября 2018

Так что я использую цикл while для чтения из файла.Мое классное задание на сборку.Таким образом, мы в основном должны игнорировать строки, которые являются пустыми или являются комментариями (в этом формате; Комментарий).У меня все работает нормально, кроме одного, если файл по какой-то причине начинается с пустой строки, программа просто перестает работать.Чтобы попытаться устранить проблему, я распечатал каждую строку, которую программа прочитала, прежде чем интерпретировать ее.Для любой другой пустой строки она просто помещает пустую строку, однако для первой строки она печатает 0 @.Сначала я думал, что, возможно, это было что-то, что случайно оказалось в памяти при запуске программы, но потом каждый раз было 0 @, и я думал, что это должно быть больше, чем совпадение.В любом случае, любая помощь с тем, что может быть не так, будет полезна.Спасибо!

int findOrigin(FILE *infile)
{
    char line[LINE_SIZE]; 
    char origin[LINE_SIZE];
    int nonComments = 0;
    int hexOrigin = 0;

    int lineCount = 0; 

    int done = 0;

    char c;

    while (fscanf(infile, "%[^\n]s", line) != EOF && lineCount < LIMIT && !done)
    {
        lineCount++;

        fscanf(infile, "%c", &c);  //Get rid of extra newline.

        removeSpaces(line);
        toUpperCase(line);
        if (line[0] != 0 && line[0] != ';')
        {
            done = 1;
            if (!strncmp(line, ".ORIG", 5))
            {
                nonComments++;
            }
            if (nonComments > 1)
            {
                printf("ERROR 1: Missing origin directive. Origin must be first line in program.");
            }
            else
            {
                if (line[5] == 'X')
                {
                    sscanf(&line[6], "%s", origin);
                    hexOrigin = 1;
                }
                else
                {
                    sscanf(&line[5], "%s", origin);
                    hexOrigin = 0;
                }
            }
        }
        line[0] = 0;
    }

    int intOrigin = -1;
    if (origin > 0 && hexOrigin == 1)
    {
        if (strlen(origin) > 4)
        {
            printf("ERROR 2: Bad origin address. Address too big for 16 bits.\n");
        }
        else
        {
            intOrigin = fromHexToDecimal(origin);
        }
    }
    else
    {
        sscanf(origin, "%d", &intOrigin);
    }
    return intOrigin;
}

void removeSpaces(char line[])
{
    char* currentLetter = line;
    for (int i = 0; line[i]; i++)
    {
        if (line[i] != ' ' && line[i] != '\t')
        {
            *currentLetter = line[i];
            currentLetter++;
        }
    }
    *currentLetter = 0;
}


void toUpperCase(char line[])
{
    for (int i = 0; line[i]; i++)
    {
        if (line[i] >= 97 && line[i] <= 122)
        {
            line[i] -= 32;
        }
    }
}

Итак, у меня есть тестовый файл, на котором я его запускаю, который выглядит примерно так

;Test file for assembly

;This is a comment

.orig x3000
	ADD R1, R2, R3
	add R0, R3, #10
	
	and R1, R1, R2
	AND R0, R3, #-10
L0			
	BR L1
	BRN L0
	BRZ L1
	BRP L0
	BRNZ L1
	BRNP L0
	BRZP L1
	BRNZP L0
	LD R1, L2
	LDR R1, R2, #-5
	L1			
	NOT R3, R4		
	ST R5, L2
	STR R6, R1, #-5 
	TRAP x20
	TRAP x21
	TRAP x22
	TRAP x23
	TRAP x24
	TRAP x25
	L2	.FILL 	0	
L3	.FILL 	0		
L4	.FILL 	0	
	
.END

If I print out each line it looks like this

0@
;Test file for assembly

;This is a comment

.ORIGX3000
ADDR1,R2,R3
ADDR0,R3,#10

ANDR1,R1,R2
ANDR0,R3,#-10
L0			
BRL1
BRNL0
BRZL1
BRPL0
BRNZL1
BRNPL0
BRZPL1
BRNZPL0
LDR1,L2
LDRR1,R2,#-5
L1			
NOTR3, R4		
STR5,L2
STRR6,R1,#-5 
TRAPx20
TRAPx21
TRAPx22
TRAPx23
TRAPx24
TRAPx25
L2.FILL0	
L3.FILL0		
L4.FILL0	
	
.END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...