【问题标题】:Reading from stdin using read(..) and figuring out the size of the buffer使用 read(..) 从标准输入读取并计算缓冲区的大小
【发布时间】:2011-09-21 16:37:26
【问题描述】:

我想知道是否有人可以告诉我在使用 read(...) 从标准输入读取输入时是否有办法动态分配缓冲区 例如:

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

【问题讨论】:

  • 是否有任何具体原因使用系统调用而不是来自 libc 的缓冲输入?
  • @sidyll:原则上有很多原因 - 例如,如果您希望另一个程序继承文件描述符并准确地从您离开的地方继续读取,或者(这对于写入更重要)如果您想知道如果发生错误以及何时发生错误,成功写入了多少。
  • @sidyll 是的,我正在从客户端向服务器发送一些信息,并且基本上对其进行了一些检查。其实R..说的。

标签: c memory-management stdin


【解决方案1】:

你不能。您在固定大小的缓冲区中执行read,例如:

char buf[BUF_SIZE];
int num_read = read(0, buf, BUF_SIZE);

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

由你来处理连接所有读取的数据。

【讨论】:

  • 正如@Cedric Julien 所说,循环将是最好的方法。感谢大家的帮助!
  • 为什么在手册页中,它使用了“应该尝试”这个词。是否存在 read 无法准确读取第三个参数指定的字节数的情况? linux.die.net/man/3/read
【解决方案2】:

你不能(除非你有预知能力)弄清楚你会得到什么。

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

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
}

【讨论】:

  • 我只是想要一些外部视角。不想那样,因为不知道,所以做不到。不过,我会喜欢一些预知技能。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2018-03-05
  • 2011-07-01
相关资源
最近更新 更多