缓冲区清除 - 输出不符合预期
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).
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).