【问题标题】:Is there any way to tell the difference between EOL and EOF in canonical mode?有什么方法可以区分规范模式下的 EOL 和 EOF 吗?
【发布时间】:2023-03-15 22:21:01
【问题描述】:

如果您在规范模式下从终端读取行,有没有办法区分以 EOL (Enter) 和 EOF (Ctrl-D) 终止的行?我的理解是两者都会返回从 read() 读取的字节数。

【问题讨论】:

    标签: c unix io terminal


    【解决方案1】:

    查看读取的最后一个字符(除非没有读取任何字符,在这种情况下您有一个 EOF)。

    int nr = read(0, buffer, sizeof buffer);
    if (nr > 0) {
      if (buffer[nr - 1] == '\n')
        { /* EOL typed */ }
      else if (nr == sizeof buffer)
        { /* Filled the buffer */ }
      else
        { /* Probably an EOF was typed, not at the start of a line */ }
    else if (nr < 0)
      { /* handle error */ }
    else
      { /* EOF */ }
    

    【讨论】:

    • 如果你键入足够多的字符来填满缓冲区,你会在没有最终的\n 的情况下读取那么多字符,所以你必须仔细检查(对于 read(2) 返回 0) 为真正的EOF
    【解决方案2】:

    对于空行上的 EOL,字节数将为 1,对于换行符。

    对于空行上的 EOF,字节数将为 0,因为“没有更多数据”。

    【讨论】:

    • 如果行中有文字怎么办?
    • 我想知道你是否会接受这个!如果该行上有文本,则发送数据以供读取,末尾没有换行符,并且返回 1 或更大的值。如果您第二次键入 EOF(这意味着您通常再次按 control-D),那么您第二次得到 0 返回,表示 EOF。尝试玩cat;键入部分行,按 control-D;再输入一些;点击 control-D,然后再次点击 control-D(都没有换行符)。
    • 我还是不明白。如果输入文本“abc”并按回车,read() 将返回 3 和“abc”。如果我输入“abc”并按 Ctrl-D 不会发生同样的事情吗?如果是这样,您如何区分?
    • 如果键入“abc”并输入,read() 将返回 4,"abc\n"。换行符是一个字符;它被读取和计数。说到这里,即使是空字节也是一个字符,并且会被读取和计数(^@ 或 control-@),尽管如果后面有字符,它会弄乱字符串。如果您输入“abc”和 control-D (EOF),那么您会得到 3 个字符。
    • 你可以试试一个小程序:#include &lt;unistd.h&gt; and #include &lt;stdio.h&gt; and int main(void) { char buffer[2048]; int n; while ((n = read(0, buffer, sizeof(buffer))) &gt; 0) printf("%d: &lt;&lt;%.*s&gt;&gt;\n", n, n, buffer); return 0; }.
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2022-02-16
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多