【问题标题】:In which condition the buffer get full在什么情况下缓冲区已满
【发布时间】:2021-08-31 05:07:09
【问题描述】:

我正在阅读有关流和缓冲区的信息。 我知道如果流是line buffered,那么每当遇到换行符时,缓冲区的累积字符就会在 from of 块中传输。 如果流是无缓冲,则字符应尽快从源出现或出现在目的地,而不会存储在缓冲区中。

但如果流是完全缓冲,那么缓冲区的累积字符会以块的形式传输只要缓冲区完全填满现在我无法理解缓冲区在什么情况下会被完全填满

【问题讨论】:

  • “缓冲区”有一个最大尺寸。这个最大尺寸存储在一个变量中。检查缓冲区是否已满就像current_size == max_size 或类似的东西。
  • @Someprogrammerdude 表示流将检查从缓冲区存储数据的变量的最大大小,并以此方式决定缓冲区的最大大小..
  • @Someprogrammerdude 如果是这样,那么在任何情况下都不会有缓冲区溢出的机会。
  • 实现会跟踪大小。没有溢出的可能性。

标签: c stream buffer


【解决方案1】:

C 标准没有明确指定流缓冲的细节,但通常流具有固定大小的缓冲区。这只是一个字节数组,用于保存流的数据。

很简单,当自上次刷新缓冲区以来写入流的字节数等于缓冲区中的字节数时,缓冲区已完全填满。

当包含<stdio.h> 时,它定义了一个宏BUFSIZ,它提供了setbuf 使用的缓冲区的大小。您可以使用printf("%d\n", BUFSIZ); 打印它。大概这是流缓冲区的默认大小,尽管 C 标准没有明确说明这一点。 (它表示setbuf 函数使用的缓冲区大小,它允许您为缓冲区提供自己的内存。)

您还可以使用较新的setvbuf 为缓冲区请求不同的大小。 setbufsetvbuf 只能在流刚刚打开之后和任何其他操作之前使用。

【讨论】:

  • 感谢您满意的快速响应。 “缓冲区的最大大小等于从缓冲区传输数据的数组或变量的最大大小”是否正确
  • 但我怀疑是否如上,那么缓冲区溢出的原因是什么?因为每个 I/O 都使用标准 I/O 流完成,所以它每次都会检查缓冲区的大小,然后就不会有缓冲区溢出的机会。但是我们知道,在gets()等一些函数中,会发生缓冲区溢出。
  • @Suraj:缓冲区溢出通常是指某些缓冲区由程序直接管理的情况。例如,给定char a[100]; scanf("%s", a);,数组a 可能会溢出,因为没有限制告诉scanf 何时停止。这是程序员的错误。相比之下,<stdio.h> 中声明的 I/O 例程通常写得很好,并且可以正确管理它们的缓冲区。
  • 在第 2 段中,您已经写到 缓冲区的大小等于之前已刷新的缓冲区大小,但是缓冲区的大小如何保持不变每次刷新后,因为缓冲区的大小取决于数据传输到或从中发生的变量或数组
猜你喜欢
  • 2012-06-05
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多