缓冲区清除 - 输出不符合预期

Buffer clearing - Output not as expected

C89 C: 我在 getchars 和 clearerr 上找到了很多,但我还是有点困惑。我希望有人能指出我们错了。

下面的代码解析一个文本文件并每行打印出一行,其中 LINEMAX 定义为 30。myFile 输入文件是合法的,因为我得到 an 答案,不是我期望的那样。

void printFile(const char* myFile)
{
    /* declare variables */
    char lineString[LINEMAX];
    FILE* lineReader;
    int lineCount;

    /* initialise  */
    lineReader = fopen(myFile, "r");
    lineCount = 1;

    /* parse the text */
    while(fgets(lineString, LINEMAX, lineReader))
    {
        /* check if last character is '\n' */
        if (lineString[strlen(lineString) - 1] != '\n')
        {
            /* check if final line (may not have '\n' character) */
            if(!feof(lineReader))
            {
                printf("ERROR: >30 characters. Buffer overload\n");
                bufferControl(lineReader);
            }
        }
        else
        {
            printf("%d: %s", lineCount++, lineString);
        } 
    }
}

void bufferControl(FILE* lineReader)
{
    int ch;

    /* parse all characters until it runs out of leftover input */
    while ((ch = getchar()) != '\n' && ch != EOF);
    clearerr(lineReader);
}

现在,我的输入文件是简单的文本文件:

Jack Shephard Surgeon
Kate Austen Criminal
Joe Smith Antidisestablishmentarialist
Hurley Reyes Philanthropist
Sun-Hwa Kwon Executive

我希望输出为:

1: Jack Shephard Surgeon
2: Kate Austen Criminal
ERROR: >30 characters. Buffer overload
3: Hurley Reyes Philanthropist
4: Sun-Hwa Kwon Executive

但我得到:

1: Jack Shephard Surgeon
2: Kate Austen Criminal
ERROR: >30 characters. Buffer overload
3: tarialist
4: Hurley Reyes Philanthropist
5: Sun-Hwa Kwon Executive

... 在 'Buffer overload' 之后的第三行,我必须按 Return 才能继续(这可能是一个线索,但我'我不明白,对不起)。我的理解告诉我 bufferControl 应该删除 'tarialist' 字符,但显然不是。有人可以向我解释我的误解吗?谢谢!

要有这个

/* parse all characters until it runs out of leftover input */

变为真,你要替换

while ((ch = getchar()) != '\n' && ch != EOF);

来自

while ((ch = fgetc(lineReader)) != '\n' && ch != EOF);

来自 man getchar()

getchar() is equivalent to getc(stdin).