从stdin读取

时间:2010-09-10 01:43:24

标签: c++

看起来好像read(0,buffer,255)在读取时总是返回1。在我的程序中,我通过管道直接输入到这个程序,但我注意到它总是返回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
]

正如我所料。