我的代码出了什么问题?解析输入文本文件(C)

时间:2018-04-30 06:09:13

标签: c visual-studio input file-io text-parsing

我需要以这种格式读入输入文件:

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()语句来测试它不会打印任何东西。我也尝试在main中打印整个Registers []数组,看看它是否填满了,但它仍然是空的。

2 个答案:

答案 0 :(得分:0)

是的确看起来你的函数parseRegisters似乎不会被调用。

这是因为你的继续&#34;第一个开关结构内的键盘工作。

正如您在此处所见:https://msdn.microsoft.com/en-us/library/0ceyyskb.aspx, &#34;继续&#34;将使你的while循环进入下一次迭代。因此,如果您获得REGISTERS或MEMORY字样,您永远不会到达第二个开关结构。

尝试删除&#34;继续&#34;关键字,所以while循环内的迭代将继续,并检查它是否更好。

更常见的是,当你有代码时,尝试使用纸张一行一行地执行它,看看会发生什么。如果有一些你不知道的东西(关键字,功能......)尽可能多地谷歌,看看其他例子。如果经过严肃的谷歌搜索后你不明白,那么Stack Overflow就在你身边!

答案 1 :(得分:0)

...&#34;我不认为parseRegisters()甚至会执行#34; ....

首先,您应该使用断点逐步完成代码,然后您可以确定代码是否会被执行。

其次,确保文件路径正确。在您的情况下,文件必须位于您的* .exe所在的文件夹中。

第三,继续意味着你跳过它下面的代码并再次启动循环。 - &GT;删除它们......