在您的情况下,标准输入是阻塞的.read
个块,直到至少有一个字节可用,然后可以返回任意大小的块.您不能对它将读取多少做出任何假设,它甚至可能总是返回一个字节.
在大多数情况下,它将读取当前可用的内容并返回.默认情况下,终端在所谓的"规范模式"下运行,并使输入逐行可用.您可以在Termios(3)手册页上阅读更多关于它的信息.因此,在您按Enter键之前,read
连一个字节都不能得到.然后该行变为可用,READ获得整个行并返回,而无需等待更多数据.
If you want to disable canonical mode and receive bytes as soon as user types them in the terminal, there is a related question about it at How to read terminal's input buffer immediately after keypress
判断是否达到EOF(Ctrl-D)或某些其他条件导致返回不完整的输入,正确的方法是什么?
在EOF条件read
返回0时,它记录在手册页中.如果您想读取整个文件,则需要在循环中调用read
,直到它返回0.如果read
返回-1,则表示错误.
如果要逐行读取文件,则需要在应用程序中实现缓冲.继续循环调用read
,直到缓冲区中有换行符.然后处理这一行,保留剩余的部分,然后重新开始阅读.或者,使用stdio.h
个函数,如fgets
,它们为您实现缓冲.