如何在VS中使用fgets

时间:2018-12-03 19:46:55

标签: c debugging

我一直试图在VS2017上运行此代码。该代码正在编译并运行,但是不是我想要的那样。因此,我尝试使用调试器,它说:

  

调试断言失败!   程序:

     

文件:minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ fgets.cpp

     

第33行

     

表达式:stream.valid()

从过去的问题中,我知道它可能是由于错误地打开文件而发生的,但是我认为我的代码确实可以解决这个问题。

任何帮助将不胜感激!

(我的相关代码):

int main(int argc, char *argv[]) {
    int i, count_commands, PC_A, lastLine;
    int *PC = &PC_A;
    FILE *memin;
    FILE *memout;
    FILE *regout;
    FILE *trace;
    FILE *count;
    assert(argc == 6);
    *PC = 0;
    count_commands = 0;
    //allocationg memory for registers content
    char **regs = (char **)(malloc(sizeof(char *) * 16));
    for (i = 0; i < 16; i++) {
        regs[i] = (char *)(malloc(sizeof(char) * 9));
        for (int j = 0; j < 8; j++) {
            regs[i][j] = '0';
        }
        regs[i][8] = '\0';
    }
    //allocationg memory for the memory image we have
    char **memory = (char **)(malloc(sizeof(char *) * 4096));
    for (i = 0; i < 4096; i++) {
        memory[i] = (char *)(malloc(sizeof(char) * 9));
        memory[i][0] = '\0';
    }

    //load memin image into memory
    char *line = (char *)malloc(sizeof(char) * 8);
    memin = fopen(argv[1], "r");
    if (memin != NULL) {
        perror(strerror(errno));
    }
    int j = 0;
    while ((line = fgets(line, 10, (FILE *)memin)) != NULL) {
        strcpy(memory[j], line);
        memory[j][8] = '\0';
        j++;
    }

1 个答案:

答案 0 :(得分:0)

打开文件后,在OP的代码中进行以下检查:

if (memin != NULL) {
    perror(strerror(errno));
}

因此,如果开头成功,则会显示错误字符串。在我的实施中,它报告:

Success: Success

打开文件失败 不会采取任何措施。

当涉及到文件中所有行的实际读取时,还有其他一些问题。分配了大小为 8 的名为char的缓冲区(line数组)并将其传递给fgets

while ((line = fgets(line, 10, (FILE *)memin)) != NULL) {
//                         ^^

请注意,还会传递 10 作为缓冲区的大小,这是错误的,因为它允许fgets写入已分配数组的边界。

此外,鉴于OP的编译器是MSVC 2017,我假设此代码在Windows上运行,因此,在文件中,行有可能以"\r\n"序列终止,而不是单个{{1} }。即使OP确信每一行都是8个字符的字符串,'\n'也需要至少 大小8 + 3(8 +'\ r'+'\ n'+' \ 0')以安全地阅读它们。

考虑如何在这些代码片段中实现这些建议:

fgets