2010-09-10 195 views
0

读取时好像读取(0,缓冲区,255)总是返回1。在我的程序中,我通过管道直接输入这个程序,但我注意到它总是返回1.为什么是这样?有没有更好的方法来做到这一点?同时,它似乎正确地填满了缓冲区,超过了1个字符。从标准输入读取

预先感谢您!

+0

因为它被标记为C++,我想这不会是问题,但只是检查,是否包含''? – Potatoswatter 2010-09-10 01:47:48

+0

没有包括在内 – Cenoc 2010-09-10 02:08:39

+0

好吧,在C语言中,如果它没有提前声明,它会被认为返回'int'(而它可能会返回64位),这可能会导致你的问题。没有理由不这样做,所以最好的做法是继续并包含它。 – Potatoswatter 2010-09-10 02:25:49

回答

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 
] 

如我所料。

+0

事情是,我缓冲区的其余部分正确填充,无论我使用[echo“blalala”|项目],它总是告诉我,我只读了1个字符,但它正确地填充了其余部分! grrr – Cenoc 2010-09-10 02:10:34

+0

@Cenoc,你说它_seems_正确填充,但在下一次读取时会发生什么?在下一个字符或字符255前进的第一个字符?这可能是读取从内部缓冲区复制大块,但仍然只会将内部缓冲区指针前进1.底线,如果读取为1,则无论缓冲区中是什么,这就是您使用的。现在,如果您使用1并因此而启动_losing_字符,那么_我们需要进一步调查。 – paxdiablo 2010-09-10 02:18:08

+0

换句话说,如果你输入“123456789”,并且执行两次读取(第一次返回1),第二次读取是否返回“2”作为第一个字符或其他东西(包括EOF的返回码0)? – paxdiablo 2010-09-10 02:35:21