【问题标题】:How large can cin input be?cin输入可以有多大?
【发布时间】:2014-01-19 09:15:30
【问题描述】:

考虑这段代码:

int a;
cin >> a;

输入例如12 时不会停止输入;它会一直等到您按下 ENTER。这是如何运作的?为什么cin 一直等待您的输入,直到您按下 ENTER

【问题讨论】:

  • 如果输入“1”后 I/O 立即停止,那么如何输入 10000 之类的整数?
  • 我举个例子。输入可以是“1”、“2”、“1000”或任何你想要的整数。
  • @J.M 你错过了 Brandin 的观点。如果输入是“1000”,但输入操作在每个字符之后结束,那么您的程序将无法将所有四个字符读入单个int。幸运的是,终端通常默认逐行缓冲,从而避免了这个问题。
  • 我会更具体。问题是,为什么在遇到第一个空格后输入没有停止?
  • 如果你点击 Ctrl D 也应该停止(并且输入流中没有换行符)

标签: c++ io cin


【解决方案1】:

您的运行时环境和终端控制原始键盘输入。通常,它们仅将输入逐行发送到应用程序,以便进行编辑。如果您希望终端立即向您发送键盘输入,您必须以与平台相关的方式与终端对话。

(这通常被称为“原始”模式,而不是通常的行缓冲“熟”模式。请注意,熟模式还处理退格和删除以及光标移动等等。)

【讨论】:

    【解决方案2】:

    cin 后面只有一个缓冲区,它被输入填满,然后在您使用提取运算符 (>>) 时被清空。何时以及如何填充取决于平台。例如,在类 Unix 系统中,输入终端处于规范或非规范模式。在规范模式下,输入是逐行提供的。在非规范模式下,它立即可用。可以在这些模式之间进行切换(查看man termios)。

    标准输入缓冲区的实际大小是实现定义的。

    【讨论】:

    • 逐行表示您的程序一次接收一行输入。显然,这取决于您编写的任何 cin >> 操作,以了解该输入会发生什么。
    • @J.M 不,这意味着您的终端在获得整行之前不会向您的程序发送任何内容。然后您的程序将接收它作为输入。如果您想在程序中逐行阅读,则必须使用getline,但没有理由不能逐字或逐字母(或其他任何内容)阅读。
    • 这意味着,如果我想从终端读取一个字符串,我能读取的最大字符串有一行那么大?
    • @J.M 那么最大的行有多长?只要用户愿意!我的意思不是一条线,但它包裹在您的终端内 - 我的意思是一条以 \n 结尾的线。
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 2017-03-28
    • 2011-08-26
    • 2017-01-24
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多