Что не так с моим кодом? Разбор через входной текстовый файл (C) - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно прочитать во входном файле в этом формате:

REGISTERS
R1 4
R7 12
MEMORY
8 19
16 25
NEXT SECTION...

Где «R1 4» означает, что регистр 1 имеет значение 4, например, или ячейка памяти 8 имеет значение 19. Я использовал 2 строки в каждой, но может быть любое произвольное количество регистров и предоставленных ячеек памяти. Для первой части моего проекта мне нужно прочитать входной файл и заполнить мои массивы правильными значениями (например, регистры [1] = 4). Это то, что я до сих пор:

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

int parseFile(FILE *filePtr, int *registers, int *memory);
void parseRegisters(const char *line, int *registers);
void parseMemory(const char *line, int *memory);

void main() {
    int Registers[32];
    int Memory[1000];
    int returnVal;

    FILE* fileIn;
    fileIn = fopen("input.txt", "r");
    if (fileIn == NULL) {
        printf("Unable to find input file\n");
        return;
    }

    returnVal = parseFile(fileIn, Registers, Memory);

    fclose(fileIn);
}


int parseFile(FILE *filePtr, int *registers, int *memory) {
    if (filePtr == NULL) {
        return 0;
    }

    char line[64];

    int mode = 0;

    while (fgets(line, sizeof line, filePtr) != NULL) {
        if (strcmp(line, "REGISTERS\n") == 0) {
            mode = 1;
            continue;
        }

        else if (strcmp(line, "MEMORY\n") == 0) {
            mode = 2;
            continue;
        }

        else {
            continue;
        }


        switch (mode) {
        case 1:
            parseRegisters(line, registers);
            break;
        case 2:
            parseMemory(line, memory);
            break;
        case 0: //will come back later for sections after MEMORY
            break;
        default:
            break;
        }
    }
    return 1;
}

void parseRegisters(const char *line, int *registers) {
    int regNum, regVal;
    printf("test");

    if (sscanf(line, "R%d %d", &regNum, &regVal) != 2)
    {
        printf("Invalid format for REGISTER section\n");
        return;
    }

    registers[regNum] = regVal;
    printf("%d %d", regNum, regVal); //was using to test if variables correctly set
    return;
}


void parseMemory(const char *line, int *memory) {
    int memLoc, memVal;

    if (sscanf(line, "%d %d", &memLoc, &memVal) != 2) {
        printf("Invalid format for MEMORY section\n");
        return;
    }

    memory[memLoc] = memVal;
    return;
}

Этот код не закончен для последующих разделов, но я тестировал только на части "Регистры", но безрезультатно. Когда я запускаю код, «режим» корректно обновляется, но я не думаю, что parseRegisters () вообще выполняется, потому что мои операторы printf (), которые я оставил там для проверки, ничего не выводят. Я также попытался распечатать весь массив Registers [] в main, чтобы увидеть, заполнен ли он, но он все еще пуст.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

... "Я не думаю, что parseRegisters () когда-либо даже выполняется" ....

Прежде всего, вы должны шаг за шагом пройти по коду с использованием точек останова, затем вы можете быть уверены, будет ли выполнен код.

Во-вторых, убедитесь, что путь к файлу указан правильно. В вашем случае файл должен находиться в той же папке, где находится * .exe или в папке проекта.

В-третьих, продолжить означает, что вы пропускаете код под ним и снова запускаете цикл. -> Удалить их ...

0 голосов
/ 30 апреля 2018

Да, действительно, кажется, что ваша функция parseRegisters не будет вызываться.

Это из-за того, что вы «продолжаете» работу с клавишами внутри вашей первой структуры коммутатора.

Как вы можете видеть здесь: https://msdn.microsoft.com/en-us/library/0ceyyskb.aspx, "continue" заставит ваш цикл while перейти к следующей итерации. Поэтому вы никогда не достигнете своей второй структуры коммутатора, если получите слова REGISTERS или MEMORY.

Попробуйте удалить ключевое слово continue, чтобы итерация внутри цикла while продолжилась, и проверьте, лучше ли это.

В более общем случае, когда у вас есть код, попробуйте выполнить его строка за строкой, используя лист бумаги, и посмотрите, что произойдет. Если есть что-то, чего вы не знаете (ключевое слово, функция, ...), попробуйте как можно больше в Google и посмотрите другой пример. Если после того, как вы серьезно погуглили, вы не поняли, то переполнение стека здесь для вас!

...