当(!feof(file))读取额外的一行

3
我遇到了从文件中读取行的问题。基本上,我的代码读入的行比它应该读入的多一个,而所有变量都为“0”,即:

如果我的文件是:

0, 0, 3, 64, 0, 0, 0, 0
2, 0, 6, 64, 0, 0, 0, 0
4, 0, 4, 64, 0, 0, 0, 0
6, 0, 5, 64, 0, 0, 0, 0
8, 0, 2, 64, 0, 0, 0, 0

它将会读取:
Object 1:  0, 0, 3, 64, 0, 0, 0, 0
Object 2:  2, 0, 6, 64, 0, 0, 0, 0
Object 3:  4, 0, 4, 64, 0, 0, 0, 0
Object 4:  6, 0, 5, 64, 0, 0, 0, 0
Object 5:  8, 0, 2, 64, 0, 0, 0, 0
Object 6:  0, 0, 0,  0, 0, 0, 0, 0

这是我的阅读算法:
while (!feof(pfile)) { 

        PcbPtr p = createnullPcb();
        fscanf(pfile, "%d,%d,%d,%d,%d,%d,%d,%d", &p->arrivaltime, &p->priority, &p->remainingcputime, 
        &p->memalloc, &p->pr,  &p->sc, &p->mo, &p->cd);
        char cwd[1024];
        char *tmp = getcwd(cwd, sizeof(cwd));
        strcat(tmp, "/process");
        p->args[0] = tmp;
        p->args[1] = NULL;

        if (!headi) {
            headi = p;
        } 
        else {
            enqPcb(&headi, p);
        }

    }

为什么会发生这种情况?谢谢任何帮助!

可能在您的输入文件末尾有一个新行(ENTER)。 - Maziar Aboualizadehbehbahani
@MaziarBouali 不,我已经检查过了,请看下面。 - Milk
1个回答

4
发生的情况是当试图读取超过文件结尾时,feof会返回true。当您已经到达文件结尾,但尚未尝试读取其他内容时,feof将返回false
简单来说:feof不代表文件是否已经结束,而是代表是否尝试读取了文件结尾后面的内容。
请注意,当您到达文件末尾并尝试读取额外一行时,fscanf将失败。您可以检查其返回值以查看它能否读取任何内容。

哦,好的谢谢。那么可能是这样的代码: if (!fscanf(pfile, "%d,%d,%d,%d,%d,%d,%d,%d", &p->arrivaltime, &p->priority, &p->remainingcputime, &p->memalloc, &p->pr, &p->sc, &p->mo, &p->cd)){ free(p) break; } - Milk
@Milk:可能行得通,fscanf 返回匹配参数的数量,因此您正在检查它是否根本没有匹配任何参数。要在注释中注释代码,请使用反引号:` - K-ballo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接