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] 举报,一经查实,本站将立刻删除。