zoukankan      html  css  js  c++  java
  • cin 在 Ctrl+Z 或 Ctrl+D 后无法获取输入

    之前在 C++ 吧里看到一个问题, 说是一个文本查询的小程序, 我在其中需要先输入一段文字, 再输入关键词来查找。

    前面输入之后我按下 Ctrl+Z 准备输入关键字。 结果怎么? 直接结束了!蛋疼。后来看了一些博客, 里面都提到了这个问题, 解决方法是加上这么一句:

    cin.clear();

    我在我的 VS 2013 上面实验,发现可行, 但根据一些博客, 还需要再加一句, 即:

    cin.clear();
    cin.sync();

    很好, 我以为这样就结束了,结果呢?在 mac 平台上,到了 cin 的时候,还是跳过去了。又找了许多博客, 都鲜有解决方法。

    直到我看了一个帖子 是这样

    简单地说,就是加这么两行:

        cin.clear();
        clearerr(stdin);

    然后再说为什么就这么跳过去了:

    cin方法检测到EOF时,将设置cin对象中一个指示EOF条件的标记。设置这个标记后,cin将不读取输入再次调用cin也不管用.....cin.clear()方法可能清除EOF标记,使输入继续进行。不过要记住的是,在有些系统中,按crl+z实际上将结束输入和输出,而 cin.clear()将无法恢复输入和输出。

    而为何添加同样的代码, Windows 上就可以,Mac 上就不可以呢?

    输入缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get() 就会检测输入缓冲区中是否有了可读的数据。cin.get() 还会对键盘上是否有作为流结束标志的 Ctrl+Z 或者 Ctrl+D 键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。

    阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。

    Windows系统中一般采用阻塞式检查 Ctrl+Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl+D。 阻塞式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。还有一个特点就是:如果输入缓冲区中有可读的数据则不会检测 Ctrl+Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道:Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是 一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。

    clearerr() 又是什么鬼?

    这个鬼

    简单地说就是它可以重置流的状态,其参数就是需要重置的流。而 cin.clear() 并不能保证可以重置流, 可以看 这个

  • 相关阅读:
    ABAP接口用法
    监听textarea数值变化
    The first step in solving any problem is recognizing there is one.
    Wrinkles should merely indicate where smiles have been.
    God made relatives.Thank God we can choose our friends.
    Home is where your heart is
    ABAP跳转屏幕
    Python 工具包 werkzeug 初探
    atom通过remote ftp同步本地文件到远程主机的方法
    Mongodb学习笔记一
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4634670.html
Copyright © 2011-2022 走看看