看起来好像read(0,buffer,255)在读取时总是返回1。在我的程序中,我通过管道直接输入到这个程序,但我注意到它总是返回1.这是为什么?有没有更好的方法呢?与此同时,它似乎正好填满了缓冲区,超过了1个字符。
提前谢谢!
答案 0 :(得分:0)
read
返回的字符少于您要求的字符数,因此您应编写该可能性的代码,而不是试图找到避免它的方法。
例如,如果文件(或管道)中只剩下22个字节,它将为您提供这些字节。
来自Linux man page(因为read
是一个POSIX事物而不是C ++事物):
如果此数字小于请求的字节数,则不是错误;这可能发生在例如因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或者因为我们正在从管道或终端读取),或者因为read()被中断了信号。
如果您的缓冲区的其余部分似乎填充正确,我可以向您保证,这完全是偶然的,您不应该依赖它。如果read
返回1,则仅使用该字符。如果您遵循规则并且角色似乎消失了,那么然后您可以回来并抱怨错误的read
实施(我不应该指出这是非常不可能的)。
尝试以下程序:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char buff[255];
int i;
while ((i = read (0, buff, 255)) > 0) {
printf ("%3d: [%*.*s]\n", i, i, i, buff);
}
return 0;
}
使用:
echo hello there | ./tstprg ; (echo hello ; sleep 1 ; echo there) | ./tstprg
看看你得到了什么。我的输出是:
12: [hello there
]
6: [hello
]
6: [there
]
正如我所料。