当前位置: 首页 > ai >正文

C语言标准I/O与文件操作

C语言标准I/O与文件操作


文件操作基础流程: 打开文件 → 读写操作 → 关闭文件


01.文件的打开与关闭

1.2 二进制文件语文本文件

如数字63,在文本文件中表示6和3两个ASCII字符表示

'6'0x36
'3'0x33
文件内容:36 33//与字符编码一致

而在二进制文件中将63直接转化成二进制形式

//在32位下,int类型,
//小端对齐(字节内部顺序不变,储存顺序与阅读顺序相反即:00 00 00 3F是我们转换的二进制内容)
//需考虑字节序/对齐
3F 00 00 00  // 63的十六进制是0x3F

1.2 文件的打开fopen()

//文件打开
FILE *fopen(const char *filename, const char *mode);
  • 功能:打开文件并返回文件指针
  • 参数
    • pathname:文件路径
    • mode:打开模式(“r”, “w”, “a”, “r+”, “w+”, "a+"等)
  • 返回值:成功返回FILE指针,失败返回NULL

打开模式: 输出->到磁盘

模式字符串含义如果指定文件不存在
“r”只读 - 打开文本文件输入数据出错
“w”只写 - 创建文本文件输出数据建立新文件
“a”追加 - 向文本文件尾添加数据建立新文件
“rb”只读 - 打开二进制文件输入数据出错
“wb”只写 - 创建二进制文件输出数据建立新文件
“ab”追加 - 向二进制文件尾添加数据建立新文件
“r+”读写 - 打开文本文件进行读写出错
“w+”读写 - 创建新文本文件进行读写建立新文件
“a+”读写 - 打开文本文件在文件尾读写建立新文件
“rb+”读写 - 打开二进制文件进行读写出错
“wb+”读写 - 创建新二进制文件进行读写建立新文件
“ab+”读写 - 打开二进制文件在文件尾读写建立新文件

注意:

  • w 系列模式("w", "w+","wb", "wb+"):强制清空
  • a 系列模式("a", "a+","ab", "ab+"):追加写入
  • r 系列模式("r", "r+","rb", "rb+"):保留内容(文件必须存在)

示例:fopen("log.txt", "r")

用户 stdlio 内核 fopen("log.txt", "r") 调用open("log.txt", O_RDONLY) 返回fd=3(后面Linux中补充) malloc(sizeof(FILE)) 初始化FILE结构体 返回FILE*指针 用户 stdlio 内核

1.3 文件的关闭fclose()

int fclose(FILE *stream);
  • 成功返回 0,失败返回 EOF
  • 必须调用以避免资源泄漏

02. 文件顺序读写

2.1字符读写

int fgetc(FILE *stream);      // 读取一个字符
int fputc(int c, FILE *stream); // 写入一个字符到流中

2.2字符串读写

int fputs(const char *str, FILE *stream);    // 写入字符串到流中

特性

  • 函数在遇到第一个 \0 时就停止

在这里插入图片描述

char *fgets(char *str, int n, FILE *stream); // 读取n-1字符到str中,最后一个位置自动补`\0`
  • fgets 读取到换行符n-1 个字符后停止
  • 自动添加 \0 终止符

在这里插入图片描述

2.3 格式化读写

int fprintf(FILE *stream, const char *format, ...); // 格式化写入到磁盘

将可变参数中的数据,按照编写的format格式写入到strem流(先缓存再刷新到磁盘)中。

  • stream:目标文件(如 stdoutstderrFILE* 文件指针)
  • format:格式化字符串(类似 printf
  • ...:可变参数
  • 返回值:成功时返回写入的字符数,失败返回负值。
+--------------------------+    格式化转换    +-------------------+    写入文件
|  变量 (age, score,add)   |  ------------>  | 格式化后的字符串    | ------------> log.txt
+--------------------------+                 +-------------------+

在这里插入图片描述


int fscanf(FILE *stream, const char *format, ...);  // 格式化读取内存

strem(文件流)中按照format的格式匹配数据,转换数据并存储到变量当中。

  • stream:源文件(如 stdinFILE* 文件指针)
  • format:格式化字符串(指定如何解析数据)
  • ...:可变参数(存储读取的数据)
  • 返回值:成功匹配的参数个数,失败或 EOF 时返回 EOF(-1)
+-------------------+    解析 & 转换     +---------------------+
| 文件内容 (字符串) |    ------------>   | 变量 (age, score,add)|
+-------------------+                   +---------------------+

在这里插入图片描述


//将格式化数据写入字符串str
int sprintf(char *str, const char *format, ...);
//从字符串str中读取格式化输入 变量...
int sscanf(const char *str, const char *format, ...);

2.4 二进制读写

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参数说明

  • ptr:指向要读写的数据的指针
  • size:单个元素字节数
  • nmemb:读写元素数量
  • stream: 文件指针

返回值:成功读写的元素个数

二进制写/读stus是一个结构体数组可做首地址类似于数组名。

在这里插入图片描述

在这里插入图片描述


03. 文件随机读写

3.1 fseek()

功能:根据文件指针位置和偏移量来定位文件指针,跳转到指定位置

int fseek(FILE *stream, long offset, int origin);
  • 参数
    • stream:文件指针。
    • offset:偏移量(字节数)。
    • origin:基准位置,可选值:
      • SEEK_SET:文件开头。
      • SEEK_CUR:当前位置。
      • SEEK_END:文件末尾。

在这里插入图片描述

3.2 ftell()

功能:返回当前文件指针相对于起始位置偏移量

long ftell(FILE *stream);

3.3 rewind()

功能:让文件指针回到文件起始位置

void rewind(FILE *stream);
http://www.xdnf.cn/news/7095.html

相关文章:

  • C++ for QWidget:自定义的信号和槽
  • QML学习03(Component、Loader)
  • OpenHarmony SIM卡信号值整体流程分析
  • 本地部署代码托管解决方案 Gitea 并实现外部访问
  • 缓冲区的用途 和 fork复制进程
  • 深度解析:AWS NLB 与 ALB 在 EKS 集群中的最佳选择
  • 内容中台智能推荐系统构建与演进
  • Python 装饰器详解
  • 提示工程 - 系统提示(System Prompts)
  • AI日报 - 2025年05月19日
  • Fine-Tuning Llama2 with LoRA
  • STC89C52单片机模拟实现洗衣机控制 Proteus仿真
  • TYUT-企业级开发教程-第一章
  • Science Robotics 封面论文:基于形态学开放式参数化的仿人灵巧手设计用于具身操作
  • 如何完美安装GPU版本的torch、torchvision----解决torch安装慢 无法安装 需要翻墙安装 安装的是GPU版本但无法使用的GPU的错误
  • C++:⾯向对象的三⼤特性
  • Java正则表达式:从基础到高级应用全解析
  • ColorAid —— 一个面向设计师的色盲模拟工具开发记
  • 超越想象:利用MetaGPT打造高效的AI协作环境
  • Vue 3 中使用 md-editor-v3 的完整实例markdown文本
  • Pandas 构建并评价聚类模型② 第六章
  • 实现菜谱二级联动导航
  • ubuntu防火墙命令和放行ssh端口
  • 03 Nginx日志格式及可视化
  • Estimation(估算):业务分析师的“不确定性对抗术”
  • LeetCode Hot100刷题——除自身以外数组的乘积
  • 【设计模式】- 行为型模式2
  • 时序数据库、实时数据库与实时数仓:如何为实时数据场景选择最佳解决方案?
  • 【Linux】第十八章 调优系统性能
  • 结构体对齐三大法则