标准IO函数一

标准IO函数一
一、Linux man 手册使用教程man 是 Linux 自带官方帮助文档分不同章节区分命令、系统调用、库函数man man查看 man 手册本身的使用说明看懂分章节规则man 1 xxx查shell 命令 / 可执行程序如man 1 lsman 2 xxx查系统调用内核底层函数 open/read/write/forkman 3 xxx查C 标准库函数标准 IO fopen/printf/fgets通俗记忆1 命令行工具2 内核系统调用3C 语言库函数写 C 代码查 IO 函数一律用man 3 函数名。二、fopen 打开文件基础信息头文件#include stdio.h函数原型c运行FILE *fopen(const char *pathname, const char *mode);参数说明pathname文件路径 文件名只写文件名代表当前文件夹mode打开模式6 种核心模式重点区分 | 模式 | 功能 | 文件不存在 | 文件存在 | 光标初始位置 | |----|----|----|----|----| |r | 只读 | 报错返回 NULL | 正常打开 | 文件开头 | |r| 可读可写 | 报错返回 NULL | 正常打开 | 文件开头 | |w | 只写 | 自动新建文件 | 清空原有全部内容 | 文件开头 | |w| 可读可写 | 自动新建文件 | 清空原有全部内容 | 文件开头 | |a | 追加只写 | 自动新建文件 | 保留原有内容 | 文件末尾 | |a| 可读 追加写 | 自动新建文件 | 保留原有内容 | 读在开头写永远在末尾 |返回值成功返回合法FILE*文件指针后续所有 IO 操作都靠它失败返回NULL同时全局变量errno记录错误编号通俗举例fopen(test.txt,w)有文件直接清空重写没有就新建fopen(log.txt,a)每次写内容都追加到文件最后不会覆盖旧日志。三、fclose 关闭文件头文件#include stdio.h原型c运行int fclose(FILE *stream);参数streamfopen 拿到的 FILE 文件指针功能刷新用户缓冲区把缓存数据写入磁盘防止数据丢失释放 FILE 结构体内存释放底层文件描述符返回值成功返回 0失败返回 EOF-1并设置 errno 错误码必记规范凡是 fopen 打开的文件程序结束前必须 fclose否则会资源泄漏、缓存数据丢失。02 内核错误码相关1. 错误码原理Linux 内核内置一堆数字错误宏如ENOENT文件不存在、EACCES权限不足全部是正整数库函数 / 系统调用出错时会把错误编号存入全局变量 errnoerrno 头文件#include errno.h错误宏定义在/usr/include/asm-generic/errno-base.h。示例c运行FILE *fp fopen(none.txt,r); if(fp NULL){ // 此时errno自动存错误编号 }2. strerror错误码转文字描述头文件#include string.h原型c运行char *strerror(int errnum);参数errnum全局变量 errno 里的错误数字返回值返回字符串指针对应错误中文 / 英文描述示例c运行printf(打开失败%s\n, strerror(errno));3. perror一键打印错误信息最常用无需手动拼接字符串自动读取 errno 并打印提示如果传入字符串s不为空输出s: 错误描述\n不传自定义提示直接写perror();只打印错误文字示例c运行FILE *fp fopen(1.txt,r); if(fp NULL){ perror(fopen打开文件); // 输出fopen打开文件: No such file or directory }对比perror 不用引入 string.h代码更简洁日常开发优先使用。03 字符读写函数 fgetc /fputc一、fgetc 读取单个字符头文件#include stdio.h原型c运行int fgetc(FILE *stream);功能从文件当前位置读取 1 个字节字符读完自动向后移动文件读写指针返回值设计重点考点读取正常把读到的unsigned char转为 int 返回0~255读到文件末尾 / 读取失败返回 EOF宏定义为 - 1为什么返回 int 而不是 charchar 默认是有符号型值 255 会变成 - 1会和 EOF (-1) 混淆转 int 可以区分真实字符和文件结束标记。练习 1fgetc 实现 wc -l 统计文件行数需求读取文本统计换行符\n数量输出总行数 实现思路判断命令行传入参数个数没有文件名提示报错fopen 只读打开文件用 perror 判断打开失败循环调用 fgetc每读到\n行数计数器 1循环结束打印行数调用 fclose 关闭文件练习 2fgetcfputc 实现 cp 文件拷贝需求模仿 Linux cp 命令把源文件完整复制到目标文件 实现思路校验命令行参数必须传入【源文件 目标文件】两个参数fopen 只读打开源文件w 模式打开目标文件循环 fgetc 读源文件单个字符读到 EOF 停止每次读到字符用 fputc 写入目标文件拷贝完成后关闭两个文件终端用diff 源文件 目标文件校验内容是否完全一致二、fputc 写入单个字符头文件#include stdio.h原型c运行int fputc(int c, FILE *stream);参数c要写入的字符传 char 变量会自动提升为 intstream目标文件指针返回值成功返回写入字符的 ASCII 码失败返回 EOF (-1)04 字符串读写函数 fgets /fputs一、fgets 读取一行字符串头文件#include stdio.h原型c运行char *fgets(char *s, int size, FILE *stream);参数s字符数组缓冲区存放读到的内容size最多读取字节上限stream文件指针核心规则必考最多读取size-1个字符末尾自动补\0字符串结束符防止数组越界两种情况停止读取读到换行符\n/ 读到文件末尾 EOF如果中途读到\n换行符会一起存入缓冲区 s返回值读取成功返回缓冲区 s读到末尾 / 读取失败返回 NULL二、fputs 写入字符串头文件#include stdio.h原型c运行int fputs(const char *s, FILE *stream);功能把字符串s里有效字符写入文件不会写入末尾的\0结束符返回值成功返回非负数失败返回 EOF (-1)配套练习fgetsfputs 实现文件拷贝需求批量按行读取、按行写入实现文件复制 实现思路检查命令行参数数量需要源文件、目标文件两个参数fopen 打开源文件 (r)、目标文件 (w)判断打开是否成功定义字符数组缓冲区循环调用 fgets 读取一行fgets 返回 NULL 代表读取完毕每次读取成功调用 fputs 把缓冲区内容写入目标文件拷贝完成关闭两个文件终端 diff 校验文件一致性全文补充拓展原文缺失重点1. fopen 模式带 b 二进制标识Windows 区分Linux 无影响Windows 下rb/wb代表二进制读写避免换行符自动转换Linux 文本 / 二进制模式无区别可加可不加。2. a 模式特殊细节a 可读可追加读文件时指针在开头但所有写操作强制跳到文件末尾无法在中间覆盖内容适合日志记录。3. fgetc 循环标准写法c运行int ch; while((ch fgetc(fp)) ! EOF){ // 处理字符ch }⚠️ 禁止用char ch接收返回值会出现 EOF 判断 bug。4. fgets 容易踩坑缓冲区大小要合理一行文本长度超过 size会分多次读取换行符只会在最后一段出现。5. 缓冲区刷新时机fclose、fflush、缓冲区满、换行符行缓冲都会把内存数据刷入磁盘程序异常崩溃会丢失缓冲区未写入数据。6. errno 使用注意只有函数明确返回失败NULL/EOF时errno 的值才有意义正常执行不会清空 errno不要跨函数复用 errno。