似乎read(0,buffer,255)在读取时总是返回1。在我的程序中,我通过管道直接输入到这个程序中,但是我注意到它总是返回一个1。为什么会这样呢?有没有更好的方法来做这件事?同时,它似乎正确地填满了缓冲区,超过了1个字符。
提前谢谢你!
发布于 2010-09-10 01:51:13
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
]
正如我所料。
https://stackoverflow.com/questions/3681796
复制