使用read(..)从标准输入读取并确定缓冲区的大小

4

我想知道是否有方法在使用 read(...) 从标准输入读取时动态分配缓冲区。

例如:

n = read(0, buffer, sizeof ?); 我该如何确保从 stdin 中读取的字节数(这里是 0)与 buffer 中的字节数相同?


有没有特定的原因要使用系统调用而不是来自libc的缓冲输入? - sidyll
@sidyll:原则上有很多原因——例如,如果你想让另一个程序继承文件描述符并在你离开的地方继续读取,或者(这对于写入更重要)如果你想知道在发生错误时成功写入了多少。 - R.. GitHub STOP HELPING ICE
1
@sidyll 是的,我正在从客户端向服务器发送一些信息,并对其进行一些检查。实际上就是 R.. 说的那样。 - Core7s
2个回答

3
你无法这样做。你需要将内容读入一个固定大小的缓冲区中,例如:
```` read(buffer, buffer_size); ````
char buf[BUF_SIZE];
int num_read = read(0, buf, BUF_SIZE);

然后确定是否还有更多数据可用(通常通过检查num_read是否等于BUF_SIZE来判断,但在某些情况下,您可能需要解释数据本身)。如果有,那么您需要进行另一次读取。以此类推。

您需要处理连接所有读取数据的问题。


正如@Cedric Julien所说,循环是最好的选择。感谢大家的帮助! - Core7s
为什么在 man 手册中使用“shall attempt”这个词?是否有任何情况下 read 不会读取第三个参数指定的确切字节数?请参考 linux.die.net/man/3/read。 - weefwefwqg3

1

除非你有预知能力,否则你无法确定你将获得的大小。

但是,读取方法允许您逐部分读取stdin的内容,如果您将read()调用放入(while your_stop_condition)循环中,您将能够通过数据包从stdin读取所需的所有内容。

char buffer_to_read[SIZE];
int bytes=0;

while your_stop_condition
{
   bytes = read(0, buffer_to_read, SIZE);
   // do what you want with your data read
   // if bytes < SIZE, you read an EOF
}

我只是想要一些外部的观点。并不想因为我不知道它,就认为它不能被完成。虽然我很想拥有一些预知能力。谢谢! - Core7s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接