IO 核心要点(1)
第一章:IO 核心要点
一、IO 概念
-
定义
- I/O:程序与操作系统或用户之间的数据交互。
- Input:数据从外部设备输入到内存。
- Output:数据从内存输出到外部设备。
- I/O:程序与操作系统或用户之间的数据交互。
-
历史回顾
stdio.h
常用函数:scanf
,printf
,getchar
,putchar
,gets
,puts
。
-
分类
- 按操作方式:串行、同步、异步、设备、阻塞 IO 等。
- 阻塞 IO 细分:
- 标准 IO:程序与用户间的交互(带缓冲区)。
- 文件 IO:程序与文件系统间的交互(无缓冲区)。
二、标准 IO vs 文件 IO(面试重点)
特性 | 标准 IO | 文件 IO |
---|---|---|
缓冲区 | 有缓冲区,数据满或条件满足后刷新 | 无缓冲区,直接调用系统函数写入文件 |
标准 | 遵循 ANSI 标准,跨平台兼容性强 | 遵循 POSIX 标准,仅类 UNIX 系统可用 |
效率 | 读取速度快(缓冲减少系统调用) | 读取速度慢(频繁系统调用) |
操作对象 | 普通文件 | 特殊文件(套接字、管道、设备文件等) |
标识符 | 使用 FILE* 流指针 | 使用文件描述符(int 类型) |
三、标准 IO 函数
-
核心函数列表
- 打开/关闭:
fopen
,fclose
- 字符读写:
fgetc
,fputc
- 字符串读写:
fgets
,fputs
- 格式化读写:
fprintf
,fscanf
- 二进制读写:
fread
,fwrite
- 文件定位:
fseek
,rewind
,ftell
- 打开/关闭:
-
关键函数详解
-
fopen
- 模式:
r
(只读)、r+
(读写)、w
(覆盖写)、w+
(读写覆盖)、a
(追加)、a+
(读写追加)。 - 返回值:成功返回
FILE*
,失败返回NULL
。
- 模式:
-
流指针(
FILE*
)- 维护缓冲区信息(起始/结束地址、读写指针位置等)。
- 结构体
_IO_FILE
包含文件描述符_fileno
和缓冲区指针。
-
错误处理
perror(const char *s)
:输出错误信息及描述。strerror(int errnum)
:返回错误码对应的字符串。
-
-
缓冲区计算
- 缓冲区大小 =
_IO_buf_end - _IO_buf_base
。
- 缓冲区大小 =
四、重要函数使用场景
-
fgets
与fputs
fgets
读取时自动添加\0
,最多读size-1
个字符,遇到\n
或文件尾停止。- 示例:
fgets(str, sizeof(str), fp)
。
-
二进制读写(
fread
/fwrite
)- 参数:数据地址、单元素大小、元素个数、流指针。
- 示例:
fwrite(arr, sizeof(int), 3, fp)
写入数组前3个整数。
-
文件定位
fseek
:移动文件指针到指定位置(SEEK_SET
/SEEK_CUR
/SEEK_END
)。ftell
:返回当前指针位置。rewind
:重置指针到文件开头。
五、作业与实践
- 文件拷贝:使用
fread
和fwrite
实现二进制文件复制。#include "headhs.h" #include <stdio.h>int main() {FILE *src, *dest;char ch;// 打开源文件src = fopen("one.txt", "r");if (src == NULL){perror("无法打开源文件");return 1;}// 打开目标文件dest = fopen("two.txt", "w");if (dest == NULL){perror("无法打开目标文件");fclose(src);return 1;}// 逐字符拷贝while ((ch = fgetc(src)) != EOF){fputc(ch, dest);}// 关闭文件fclose(src);fclose(dest);printf("文件拷贝成功!\n");return 0; }
- 统计文件行数:通过
fgets
逐行读取并计数。#include "headhs.h" #include <stdio.h> int main() {FILE *file;char line[256];int line_count = 0;// 打开文件file = fopen("one.txt", "r");if (file == NULL){perror("无法打开文件");return 1;}// 逐行读取并计数while (fgets(line, sizeof(line), file)) {line_count++;}// 关闭文件fclose(file);// 输出行数printf("文件的行数为: %d\n", line_count);return 0; }
- 思维导图:梳理标准 IO 函数分类及关系。
- 牛客网刷题:巩固文件操作相关知识点。
六、其他注意事项
- 错误码:
errno
范围 1~133,需包含<errno.h>
。 - 开发工具:使用
ctags
追代码(ctrl+]
跳转,ctrl+t
返回)。 - 结构体写入:如学生信息需转换为二进制写入,避免直接文本写入。