【问题标题】:what happend when I close the buffer of stdin and ungetc to stdin?当我将 stdin 和 ungetc 的缓冲区关闭到 stdin 时发生了什么?
【发布时间】:2015-10-19 15:25:34
【问题描述】:

当我在阅读一本关于 linux 编程的书时,我想到了它,我在我的电脑上尝试了一下,代码运行良好,但我就是不明白它是如何工作的,希望有人能帮我解释一下, 提前致谢! 我的代码如下:

#include <iostream>
#include <cstdio>

using namespace std;

int main() {
    setbuf(stdin, NULL);
    unsigned char ch = 'a';
    unsigned char pch = ungetc(ch, stdin);
    char c = getchar();
    putchar(c);
    return 0;
}

【问题讨论】:

  • 如果这是 c++,为什么不使用 ifstream 和 cin 运算符?
  • 是的,就是我熟悉的c++风格,我只是想验证一下ungetc的功能和输入流的缓冲。

标签: c++ linux io buffer


【解决方案1】:

不管缓冲区设置如何,ungetc 必须始终能够将一个字符推回输入流中。如果您尝试推送多个字符,ungetc 可能会失败。 (您应该检查返回值是否失败。)

保证一个字符的后退。如果在同一流上调用 ungetc 函数太多次而没有对该流进行干预读取或文件定位操作,则操作可能会失败。 (§7.21.7.10/第 3 段)

所以单个ungetc 是有效的,即使没有输入缓冲区。

【讨论】:

  • 从你所说的和我的拙见中,ungetc 可能会将字符输入一个特殊的缓冲区,并且每次标准输入流想要获取一个字符时,它首先尝试从特殊的缓冲区,然后从我设置为 NULL 的普通缓冲区,对吗?
  • @kuixiong:如果您认为单个char 是一个缓冲区,那是完全正确的。
猜你喜欢
  • 2014-01-15
  • 2011-11-28
  • 2011-05-15
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2014-06-23
相关资源
最近更新 更多