微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GNU-getline:关于EOF的奇怪行为

testing

为了findgetline()在面对EOF时的行为,我写了下面的testing:

int main (int argc,char *argv[]) { size_t max = 100; char *buf = malloc(sizeof(char) * 100); size_t len = getline(&buf,&max,stdin); printf("length %zu: %s",len,buf); }

而input1是:

a b c Ctrl-D Enter

结果:

通过套接字发送任意长度的数组。 字节序

如何让scanf读取超过4095个字符作为input?

创build虚拟设备

是否有asynchronous的方式知道文件已经改变?

Windows 8.1创buildPOST请求

length 4: abc //notice that 'n' is also taken into consideration and printed

input2:

a b c input

完全相同的输出

length 4: abc

看来EOF被getline()省略了

代码

所以我find了getline()的源代码,下面是它的一个相关的代码片段(为了简洁,我省略了一些注释和不相关的代码):

while ((c = getc (stream)) != EOF) { /* Push the result in the line. */ (*lineptr)[indx++] = c; /* Bail out. */ if (c == delim) //delim here is 'n' break; } /* Make room for the null character. */ if (indx >= *n) { *lineptr = realloc (*lineptr,*n + line_size); if (*lineptr == NULL) return -1; *n += line_size; } /* Null terminate the buffer. */ (*lineptr)[indx++] = 0; return (c == EOF && (indx - 1) == 0) ? -1 : indx - 1;

所以我的问题是:

为什么这里的长度是4(据我所知应该是5)(正如wiki所说,如果不是在行的开头就不会是EOF)

一个类似的问题: EOF行为伴随着其他值,但在该问题中注意到getline()与GNU-getline不同

我使用GCC:(Ubuntu 4.8.2-19ubuntu1)4.8.2

在没有文件下载对话框的情况下在Webbrowser控件中打开办公文档

有什么办法强制一个进程的工作集在C + + 1GB?

WIndows – 基于清单的ETW提供者问题

捕获窗口像素,而不pipe它的z顺序

在Windows中join相当于

如果输入缓冲区没有被刷新, Ctrl-D会导致终端刷新输入缓冲区。 否则,设置输入流的文件结束指示符。 换行符也刷新缓冲区。

所以你没有关闭流,但只刷新输入缓冲区,这就是为什么getline没有看到文件结束标志。

在这两种情况下, getline都会收到一个字面的EOT 字符 (ASCII 0x04, ^D )(为了达到这个目的,可以键入Ctrl-V Ctrl-D )。

类型

a b c Ctrl-D Ctrl-D

要么

a b c 输入 Ctrl-D

实际设置文件结束指示符。

从POSIX :

特殊字符

EOF

输入上的特殊字符,如果ICANON标志被设置,则被识别。 收到时,等待读取的所有字节将立即传递给进程,而不等待<newline> ,并且EOF被丢弃。 因此,如果没有等待的字节(也就是说,EOF发生在一行的开始处),则从read()返回零的字节计数,表示文件结束指示。 如果ICANON被设置,EOF字符在处理时将被丢弃。

仅供参考, 此处指定ICANON标志。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐