【发布时间】:2023-03-15 22:21:01
【问题描述】:
如果您在规范模式下从终端读取行,有没有办法区分以 EOL (Enter) 和 EOF (Ctrl-D) 终止的行?我的理解是两者都会返回从 read() 读取的字节数。
【问题讨论】:
如果您在规范模式下从终端读取行,有没有办法区分以 EOL (Enter) 和 EOF (Ctrl-D) 终止的行?我的理解是两者都会返回从 read() 读取的字节数。
【问题讨论】:
查看读取的最后一个字符(除非没有读取任何字符,在这种情况下您有一个 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。
对于空行上的 EOL,字节数将为 1,对于换行符。
对于空行上的 EOF,字节数将为 0,因为“没有更多数据”。
【讨论】:
cat;键入部分行,按 control-D;再输入一些;点击 control-D,然后再次点击 control-D(都没有换行符)。
read() 将返回 4,"abc\n"。换行符是一个字符;它被读取和计数。说到这里,即使是空字节也是一个字符,并且会被读取和计数(^@ 或 control-@),尽管如果后面有字符,它会弄乱字符串。如果您输入“abc”和 control-D (EOF),那么您会得到 3 个字符。
#include <unistd.h> and #include <stdio.h> and int main(void) { char buffer[2048]; int n; while ((n = read(0, buffer, sizeof(buffer))) > 0) printf("%d: <<%.*s>>\n", n, n, buffer); return 0; }.