【发布时间】:2016-06-28 07:06:42
【问题描述】:
我是 C 初学者,我想连续调用 ungetc() 两次,尽管我知道在常规 C 中这是不允许的。有人告诉我我可以修改Fflush() 来完成这项工作,但是我不知道该怎么做。
这是我的代码,我的Fflush 只允许一个ungetc(),我希望它允许两次。
#define altUngetc(c, fp) ((fp)->next > (fp)->buffer && (c) != EOF ? \
*--(fp)->next = (c) : EOF)
int altGetc(ALT_FILE *fp) {
if (fp->next == fp->buffer + fp->bufSize)
altFflush(fp);
return fp->flags & FILE_ATEOF ? EOF : *fp->next++;
}
int altFflush(ALT_FILE *fp) {
int res;
if (fp->fd < 0 || fp->flags & FILE_ATEOF)
return EOF;
if (fp->flags & FILE_READ) {
res = read(fp->fd, fp->buffer, BUF_SIZE);
if (res == 0)
fp->flags |= FILE_ATEOF;
fp->bufSize = res;
fp->next = fp->buffer;
}
else {
res = write(fp->fd, fp->buffer, fp->next - fp->buffer);
fp->next = fp->buffer;
}
return res < 0 ? EOF : 0;
}
【问题讨论】:
-
我认为
fflush()不会达到这个目的。如果我理解正确,您打算执行两次ungetc(),并保证您的代码可以正常工作,对吗? 编辑:它不会撤销ungetc()的效果。这意味着它对您的目的仍然无效。 -
建议:作为 C 初学者,您可能应该首先学会遵守规则,而不是试图打破规则。
-
是的,我想要的是修改原来的 fflush() 代码。我认为这将是一个安排至少两个字符在缓冲区中的问题是“ungotten”,无论如何。
-
@yuanwang:你的代码怎么失败了?在我看来,您应该能够在
fflush回电后立即读取最多BUF_SIZE字符,尽管我承认我没有详细检查它。然而,更合理的方法是在缓冲区前面保留正常未使用的额外空间所需的尽可能多的字符,ungetc将被允许备份到该缓冲区。本质上是setvbuf(stream, &buffer[2], _IOFBF, sizeof buffer - 2),除了为合作而设计的自定义缓冲代码。 -
请注意,虽然 C 标准仅保证使用
ungetc()回推一个字符(并且它说“在调用之前文件位置指示符为零的二进制流上使用 ungetc是一个过时的功能”),许多实现允许更大量的推回。 IIRC,一个老式的 AIX 是最简洁的,只允许 4 个字符,而 Linux 和 BSD 允许 4 KiB(可能更多;我的测试停止在 4 KiB)。
标签: c stdio fflush getc ungetc