读取时好像读取(0,缓冲区,255)总是返回1。在我的程序中,我通过管道直接输入这个程序,但我注意到它总是返回1.为什么是这样?有没有更好的方法来做到这一点?同时,它似乎正确地填满了缓冲区,超过了1个字符。从标准输入读取
预先感谢您!
读取时好像读取(0,缓冲区,255)总是返回1。在我的程序中,我通过管道直接输入这个程序,但我注意到它总是返回1.为什么是这样?有没有更好的方法来做到这一点?同时,它似乎正确地填满了缓冲区,超过了1个字符。从标准输入读取
预先感谢您!
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
]
如我所料。
事情是,我缓冲区的其余部分正确填充,无论我使用[echo“blalala”|项目],它总是告诉我,我只读了1个字符,但它正确地填充了其余部分! grrr – Cenoc 2010-09-10 02:10:34
@Cenoc,你说它_seems_正确填充,但在下一次读取时会发生什么?在下一个字符或字符255前进的第一个字符?这可能是读取从内部缓冲区复制大块,但仍然只会将内部缓冲区指针前进1.底线,如果读取为1,则无论缓冲区中是什么,这就是您使用的。现在,如果您使用1并因此而启动_losing_字符,那么_我们需要进一步调查。 – paxdiablo 2010-09-10 02:18:08
换句话说,如果你输入“123456789”,并且执行两次读取(第一次返回1),第二次读取是否返回“2”作为第一个字符或其他东西(包括EOF的返回码0)? – paxdiablo 2010-09-10 02:35:21
因为它被标记为C++,我想这不会是问题,但只是检查,是否包含''? –
Potatoswatter
2010-09-10 01:47:48
没有包括在内 – Cenoc 2010-09-10 02:08:39
好吧,在C语言中,如果它没有提前声明,它会被认为返回'int'(而它可能会返回64位),这可能会导致你的问题。没有理由不这样做,所以最好的做法是继续并包含它。 – Potatoswatter 2010-09-10 02:25:49