你好,我刚开始学C语言,正在阅读K&R。在里面关于文本流的定义“文本流是由换行符分隔的字符序列;每一行由0个或多个字符组成,后跟一个换行符”,这个定义让我感到困惑。
为了了解这些流,我接触到了一个新术语——缓冲区。
我只知道:
- 在输入和输出设备之间的数据(字节或字符)连续流动形成了流。
- 临时存储输入或输出数据的主内存区域称为缓冲区。
我不确定我的理解是否正确,但这是我对这些概念的基本理解。
我想知道缓冲区和流实际上是什么以及这两个概念(即流和缓冲区)在C语言的具体实现中如何协同工作。
你好,我刚开始学C语言,正在阅读K&R。在里面关于文本流的定义“文本流是由换行符分隔的字符序列;每一行由0个或多个字符组成,后跟一个换行符”,这个定义让我感到困惑。
为了了解这些流,我接触到了一个新术语——缓冲区。
我只知道:
我不确定我的理解是否正确,但这是我对这些概念的基本理解。
我想知道缓冲区和流实际上是什么以及这两个概念(即流和缓冲区)在C语言的具体实现中如何协同工作。
fgets(str, sizeof(str), STREAM)
…其中的stream可以是任何输入流,无论是stdin还是文件。这些实际上是相当好的工作定义。
在实际的C语言术语中,缓冲区是一个数组(通常是char
或unsigned char
类型),用于存储数据,无论是作为输入操作的结果还是在发送到输出之前。该数组可以声明为固定大小的数组,例如:
char buffer[SOME_BUFFER_SIZE];
char *buffer = malloc( SOME_BUFFER_SIZE * sizeof *buffer );
char
数组;对于二进制输入/输出,通常会使用unsigned char
数组。Received from Web server Stored in browser's input buffer
------------------------ --------------------------------
HTTP/1.1 200 OK \r\n <!DOCTYPE HTML><html
Content-length: 20\r\n
<!DOCTYPE HTML><html
HTTP/1.1 200 OK \r\n <!DOCTYPE HTML><html><head><title>This i
Content-length: 20\r\n
><head><title>This i
HTTP/1.1 200 OK \r\n <!DOCTYPE HTML><html><head><title>This i
Content-length: 20\r\n s a test</title></he
s a test</title></he
HTTP/1.1 200 OK \r\n <!DOCTYPE HTML><html><head><title>This i
Content-length: 20\r\n s a test</title></head><body><p>Hello, W
ad><body><p>Hello, W
HTTP/1.1 200 OK \r\n <!DOCTYPE HTML><html><head><title>This i
Content-length: 19 s a test</title></head><body><p>Hello, W
orld!</body></html> orld!</body></html>
定义并不差,实际上非常好。你可以从面向对象的角度补充一下,流使用缓冲区。
使用缓冲区可能是必要的,例如出于性能原因,因为每个系统调用都带有相对较高的成本。
特别是IO系统调用、硬盘或网络访问与内存访问时间相比较慢。如果读取或写入仅包含单个字节,则这些成本会累加。
输入/输出设备的两种常见抽象形式是:
流 - 在设备准备好时传输可变数量的字节。
块 - 传输固定大小的记录。
缓冲区只是保存正在传输的数据的内存区域。
fgets
时,你可以看到幕后发生了什么。如果你正在寻找一个有趣的项目,可以编写一个聊天服务器/客户端设置,使用Beej的网络指南,它将帮助你开始进行Linux编程(并进一步提高你对流的知识)。 - LEF