c - 流与缓冲区

标签 c io buffer bufferedinputstream

我是 C 的新手。我目前正在阅读 K&R。在那里,我对其中关于文本流的定义感到困惑“文本流是分成新行的一系列字符;每行由 0 个或多个字符后跟一个换行符组成。” 为了了解这个流,我被引入了一个新术语,即缓冲区。

我只知道:

  • 输入和输出设备之间的连续数据流(字节或字符)是
    STREAM .
  • 主存中的一个临时存储区,用于临时存储输入或输出数据 是一个BUFFER

我并不是说我是对的,但这是我对这些条款的基本看法。

我想知道,缓冲区和流实际上是什么,以及这两个东西(即流和缓冲区)如何在 C 实现的非抽象级别协同工作。

最佳答案

您在 C 中有三个流,stdin , stdout , 和 stderr , 你也可以想到你用 fopen 打开的文件例如作为流。 stdin一般是键盘,stdout通常是您的显示器,stderr通常也是您的显示器。但它们不一定是,它们是硬件的抽象。

例如,如果您没有键盘,而是银行 ATM 上的小键盘,那么 stdin将是键盘,如果你没有显示器而是有打印机,那么 stdout将是打印机。您可以通过调用您的操作系统来更改他们使用的硬件。您还可以再次通过调用您的操作系统来更改它们的行为,这超出了您所要求的范围。

因此,在某种程度上,可以将缓冲区视为操作系统分配的与流关联的内存,用于保存从硬件组件接收的数据。例如,当您在键盘上键入时,您键入的字符不会被 IDE 直接捕获,它们会从那里移动到缓冲区中,然后您读取缓冲区。

这就是为什么,例如,您必须在代码开始与您在键盘上键入的任何内容进行交互之前按下回车键,因为 stdin是行缓冲的。控制权从您的程序传递到操作系统,直到它遇到将控制权发送回您的程序的东西,在正常情况下,这将是换行符。

所以在某种程度上,可以这样想,流是设备(键盘、显示器或硬盘上的文件),缓冲区是操作系统控制时保存数据的地方,然后您在处理数据时与缓冲区交互。

该抽象允许您以通用方式使用所有这些不同的东西,而不管它们是什么,例如:fgets(str, sizeof(str), STREAM) ...流可以是任何输入流,可以是stdin或一个文件。

更进一步,这就是为什么新程序员会被 scanf 抛弃的原因对于 int接着是 fgets ,因为 scanf读取 int从缓冲区但留下 \n在缓冲区中...然后调用 fgets读取 \nscanf留在那里,新程序员想知道为什么他们无法输入任何数据。因此,您对流和缓冲区的好奇心将有助于您继续学习 C。

关于c - 流与缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68591567/

相关文章:

c# - StreamReader ReadLine 正在修改/不释放 Stream

c++ - 在 C++ 中解析字符串

c++ - 是否需要为 C/C++ 中的文件 I/O 操作创建自己的缓冲区?

java - 声明来自套接字的输入/输出流以防止程序继续

python - 如何有效地从socket.recv()中解包数据?

java - Protobuf/ Protocol Buffer - IndexOutOfBoundsException

c - 在 C 代码中强制出现蓝屏(来自简单的驱动程序错误?)

c - 使用GDB远程调试多线程C程序

c - 使用 ftell() 和 fseek() 函数时遇到问题

c - 嵌入式系统不需要操作系统的数据库