在C语言中,输入/输出(I/O)模型是程序与外部环境(如文件、终端等)进行数据交换的重要机制。本文将详细介绍C语言中的输入/输出模型,包括其基本概念、不同的I/O函数、缓冲区的概念以及示例代码和注释。
这些年,我们的硬件设备:CPU
,内存,
I
/
O
设备都在不断迭代,不断朝着更快的方向努力。但是,在快速发展的过程中,有一个核心矛盾一直存在,那就是这三者之间
的速度差异
。我们可以形象地描述为:
CPU
一天,内存一年;内存一天,
IO
设备十年。(
假设
CPU
执行一条普通指令需要一天,那么
CPU
读取内存就需要一年;假设内存之间传递单位数据需要一天,那么内存与 IO
设备之间传递单位数据就需要十年
)
。为了平衡这三者之间的鸿沟,一个有效的手段是引入缓冲
,如下图所示:
![](https://img-blog.csdnimg.cn/direct/bdb2e88577a142f0833a7c325db3f9e7.png)
为了平衡内存和 IO
设备之间的速度差异,我们会在
内存
中设置一些缓冲区
(
buffer
)
,其中就有标准输入缓冲区 (
stdin
)
和标准输出缓冲区
(
stdout
).
一般情况下,
stdin
关联到键盘,而 stdout
关联到屏幕。
scanf
的作用是,从
stdin
读取数据到程序;而printf 的作用是,将输出结果写入到
stdout
。
基本概念
C语言的I/O操作主要涉及以下几个核心概念:
-
文件描述符:
- 文件描述符是一个用于标识文件或其他I/O资源的整数值。在UNIX和类UNIX系统中,通常0表示标准输入(stdin)、1表示标准输出(stdout)、2表示标准错误输出(stderr),其他文件描述符用于表示打开的文件或设备。
-
缓冲区:
- 缓冲区是内存中的一个区域,用于临时存储I/O数据。C语言中的标准I/O库提供了缓冲机制,可以显著提高I/O效率。
-
阻塞和非阻塞I/O:
- 阻塞I/O指的是当程序发起I/O操作时,如果无法立即完成,程序将阻塞(挂起)直到操作完成为止。非阻塞I/O允许程序继续执行其他任务而不必等待I/O操作完成。
标准I/O函数
C语言中的标准I/O函数包括在 <stdio.h>
头文件中,常见的函数有:
printf
:向标准输出打印格式化数据。scanf
:从标准输入读取格式化数据。fprintf
、fscanf
:类似于printf
和scanf
,但操作指定文件。fopen
、fclose
:打开和关闭文件。fread
、fwrite
:从文件读取数据和向文件写入数据。fgets
、fputs
:从文件读取字符串和向文件写入字符串。fseek
、ftell
:在文件中定位和获取当前文件位置。
#include <stdio.h>
int main() {
FILE *fp;
char buffer[100];
int num;
// 打开文件以写入数据
fp = fopen("file.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// 写入字符串到文件
fprintf(fp, "This is a test file.\n");
fputs("Hello, World!\n", fp);
// 关闭文件
fclose(fp);
// 打开文件以读取数据
fp = fopen("file.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// 从文件读取数据并输出到标准输出
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
// 关闭文件
fclose(fp);
return 0;
}