标准io

标准IO与流

   关于标准io,就涉及到很多的知识,,系统调用,缓冲区,流的概念。。。


那么标准io指什么?  ---> ANSIC 中定义的用于io操作的一系列函数,即为输入输出操作的相关函数。 在这么我们不能认为输入输出就是用鼠标键盘写东西,再从文件中打印东西到屏幕上,而是对于流的操作,流入流出。

在linux系统里有一句话叫做,everything is file,一切皆文件

意思是你所看到的都可以理解为文件,那么我们的键盘,鼠标,系统,都可以看成文件,我们利用流来进行操作文件。

那么,什么是流???

水是怎么来的?水的化学式h2o,这样两个氢原子加上一个氧原子就构成了一个水分子,而无数的水分子构成了水滴,无数的水滴又构成了水流,水流形成江河大海。。。

类似的,我们计算机中的流也可以这么看:由无数基本单位组成的“水流”,那么我们的单位看成什么?我们都知道计算机使用二进制数来存储数据,那么一个字节是8个bit位,每个bit位由0\1来描述,那么无数个字节就构成了  ----------字节流。

假设我有一个普通文件,里面写满了英文字母,那么我们从中读出数据,是不是把里面的字节全部读出?就像水流一样“流出”,“流入”屏幕上。

字节流可分为文本流和二进制流,具体差异在哪里就不一一赘述,可百度查看。


我们标准io的核心对象就是流。当我们调用标准io相关函数操作一个文件时,就会创建一个名叫  FILE 的结构体,用于描述该文件,这个结构体,我们形象的称为 流。

通过FILE 创建的流  ,我们可实现对文件的相关操作,写入,读取,删除,查看相关属性,通过流,文件就像橡皮泥一样,想怎么捏就怎么捏,当然,也不能随意的瞎操作。。。


标准io中,存在缓冲区,分为三种类型: 全缓冲------------->填满io缓冲区后,才进行实际的io操作

行缓存------------>输入输出遇到换行符\n 执行io操作

无缓存-------------->不对io操作进行缓冲。典型的有标准出错流 stderror


为什么加缓冲区???

在我们对文件进行操作时, 实际上是对系统进行调用,过程中,linux需要从用户态切换到内核态,这样我们每次进行读写都要频繁的切换状态,这样对系统的开销很大,

所以不如建立一个缓冲区,一次性的读完或者写完放进缓冲区,在进行系统调用,从缓冲区读出写,可以大大的减少系统的开销。



这些就是标准io的基本概念。

### 什么是标准IO? **标准IO(Standard I/O)** 是C语言标准库(`<stdio.h>`)提供的一组用于输入输出操作的**高级函数接口**。它对底层的系统调用(如 `read()` 和 `write()`)进行了封装,提供了**缓冲机制**,提高了IO效率,并增强了程序的**可移植性**。 --- ### 标准IO的特点 | 特点 | 描述 | |------|------| | **缓冲IO** | 标准IO自带缓冲区,减少系统调用次数,提高效率。 | | **面向流(FILE *)** | 所有操作都通过 `FILE *` 指针进行,屏蔽了底层细节。 | | **跨平台兼容性好** | 在不同操作系统(如Windows、Linux)上表现一致。 | | **使用方便** | 提供丰富的函数如 `fscanf()`、`fprintf()`、`fgets()`、`fread()` 等。 | --- ### 标准IO与系统调用IO的区别 | 对比项 | 标准IO | 系统调用IO | |--------|--------|-------------| | 缓冲机制 | 有缓冲 | 无缓冲(除非手动实现) | | 接口来源 | C标准库(`<stdio.h>`) | 操作系统API(如Linux的 `<unistd.h>`) | | 数据类型 | `FILE *` | 文件描述符 `int` | | 可移植性 | 高 | 低(依赖系统) | | 函数示例 | `fopen`, `fread`, `fwrite`, `fclose` | `open`, `read`, `write`, `close` | --- ### 标准IO的核心结构:`FILE *` - `FILE *` 是一个指向 `FILE` 结构体的指针,该结构体由C标准库定义,包含了文件状态、当前位置、缓冲区等信息。 - 示例: ```c FILE *fp = fopen("example.txt", "r"); if (fp == NULL) { perror("打开文件失败"); return 1; } ``` --- ### 常用标准IO函数 | 函数名 | 功能 | |--------|------| | `fopen()` | 打开文件 | | `fclose()` | 关闭文件 | | `fread()` | 从文件读取二进制数据 | | `fwrite()` | 向文件写入二进制数据 | | `fgets()` | 从文件或标准输入读取一行字符串 | | `fputs()` | 向文件或标准输出写入一行字符串 | | `fprintf()` | 格式化输出到文件或标准输出 | | `fscanf()` | 格式化输入从文件或标准输入 | --- ### 示例:使用标准IO读写文件 ```c #include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("output.txt", "w"); if (!fp) { perror("无法打开文件"); return EXIT_FAILURE; } // 写入文本 fprintf(fp, "Hello, Standard IO!\n"); fclose(fp); // 读取文件 fp = fopen("output.txt", "r"); if (!fp) { perror("无法打开文件"); return EXIT_FAILURE; } char buffer[100]; if (fgets(buffer, sizeof(buffer), fp)) { printf("读取内容: %s", buffer); } fclose(fp); return 0; } ``` --- ### 总结 标准IO是C语言中最常用的IO操作方式,它基于系统调用IO进行了封装,提供了缓冲机制和统一的接口,使得程序开发更高效、更安全、更可移植。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值