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

文件基础操作详解

一、为什么使用文件?

核心问题:数据持久化存储

  • 内存的局限性

    • 程序运行时数据存储在内存中

    • 程序退出时内存被回收,数据丢失

    • 无法保留历史数据

  • 文件的优势

    • 数据存储在硬盘/磁盘上

    • 程序关闭后数据依然保留

    • 支持长期、持久化的数据存储




二、什么是文件?

文件分类(按功能分类)

  1. 程序文件
  • 源程序文件(.c)

  • 目标文件(.obj)

  • 可执行文件(.exe)

  1. 数据文件
  • 程序运行时需要从中读取数据的文件、输出内容的文件

  • 本章重点讨论的对象



传统输入输出的局限性

  • 输入对象:终端键盘

  • 输出对象:显示器

  • 无法实现数据的长期保存和重复使用



文件名

  • 一个文件要有一个唯一的标识,以便用户识别和引用

  • 文件标识 = 文件路径 + 文件主干名 + 文件后缀(文件的身份证)

  • 为了方便起见,文件标识常被称为文件名

示例:C:\Users\Desktop\example.txt




三、二进制文件和文本文件(按内容分类)

数据存储方式对比

存储方式特点文件大小可读性
二进制文件直接以内存中的二进制形式存储较小不可直接阅读
文本文件以ASCII码形式存储较大可直接阅读


存储示例

  • 整数 10000 的存储:

    • 二进制:00100111 00010000(2字节)

    • ASCII:'1''0''0''0''0'(5字节)

    在这里插入图片描述

注意:用文本编辑器打开二进制文件会显示乱码,因为文本编辑器会以ASCII的形式翻译二进制序列




四、流(Stream)的概念

什么是流?

是C语言中一个重要的抽象概念,它就像一条"数据的河流",数据在这条河流中流动。这个设计让程序员能够用统一的方式来处理各种不同的输入输出设备



为什么需要流?

计算机需要与各种外部设备交互:

  • 输入设备:键盘、文件、网络等

  • 输出设备:显示器、打印机、文件等

每种设备都有独特的操作方式,如果没有流的概念,程序员需要为每种设备编写特定代码,既繁琐又容易出错。

流的价值:提供统一抽象层,把所有输入输出设备都看作是"数据的河流",程序员只需要学会与"河流"打交道,而不需要关心具体设备细节。



流的操作流程

  1. 打开流 - 建立与数据源的连接

  2. 操作流 - 读取或写入数据

  3. 关闭流 - 断开连接,释放资源



标准流

C程序启动时自动打开三个标准流:

  • stdin - 标准输入流(通常为键盘)

  • stdout - 标准输出流(通常为显示器)

  • stderr - 标准错误流(通常为显示器)




五、文件指针

关键概念:文件类型指针

在C语言中,我们通过**FILE***类型的文件指针来维护流的各种操作。这是缓冲文件系统中的核心概念。



文件信息区

  • 每个打开的文件都会在内存中创建一个文件信息区

  • 这个信息区是一个FILE结构体变量,通常包含:

    • 文件名、文件状态

    • 文件当前位置

    • 缓冲区信息等

不同编译器对FILE的具体定义略有差异

// VS2013中的FILE结构示例
struct _iobuf 
{char *_ptr;        // 缓冲区当前位置int   _cnt;        // 剩余字符数char *_base;       // 缓冲区基地址int   _flag;       // 文件状态标志int   _file;       // 文件描述符int   _charbuf;    // 字符缓冲区int   _bufsiz;     // 缓冲区大小char *_tmpfname;   // 临时文件名
};
typedef struct _iobuf FILE;

重要:作为使用者,我们不需要关心FILE结构体的具体成员,系统会自动管理这些细节。



文件指针的作用

FILE* pf;  // 创建一个文件指针变量
  • pf指向文件信息区通过信息区访问实际文件

  • 相当于文件的"遥控器",通过指针间接操作文件

在这里插入图片描述



文件操作流程

  1. 打开文件 → 打开流

  2. 操作文件 → 操作流

  3. 关闭文件 → 关闭流

文件指针贯穿整个操作过程,是连接程序与文件的桥梁。




六、文件的打开和关闭

文件操作函数

// 打开文件
FILE *fopen(const char *filename, const char *mode);// 关闭文件
int fclose(FILE *stream);


文件打开模式

模式含义文件要求
"r"只读文件必须存在
"w"只写创建新文件/清空已存在内容再写
"a"追加创建新文件/在已有内容末尾添加
"r+"读写文件必须存在
"w+"读写创建新文件/清空已存在文件
"a+"读写创建新文件/在已有文件末尾添加

二进制模式:在以上模式后加b,如"rb""wb"



完整示例

#include <stdio.h>int main() 
{FILE *pFile;// 打开文件 - 多种路径写法pFile = fopen("myfile.txt", "w");                    // 当前目录pFile = fopen("C:/Users/Desktop/myfile.txt", "w");   // 绝对路径pFile = fopen("./../myfile.txt", "w");               // 相对路径// 检查文件是否打开成功if (pFile == NULL) {perror("fopen");  // 输出错误信息return -1;}// 文件操作...// 关闭文件fclose(pFile);pFile = NULL;  // 防止野指针return 0;
}



七、文件的顺序读写

顺序读写函数分类

功能函数名适用流
字符输入fgetc所有输入流
字符输出fputc所有输出流
文本行输入fgets所有输入流
文本行输出fputs所有输出流
格式化输入fscanf所有输入流
格式化输出fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件


字符顺序读写示例

// 写字符到文件
for(int ch = 'a'; ch <= 'z'; ch++) 
{fputc(ch, pFile);
}// 从文件读取字符
int ch = 0;
while((ch = fgetc(pFile)) != EOF) 
{printf("%c ", ch);
}// 标准流使用
int ch = fgetc(stdin);    // 从键盘读取
fputc(ch, stdout);        // 输出到屏幕



八、补充知识点

文件路径说明

  • 绝对路径:从根目录开始的完整路径

  • 相对路径

    • . 表示当前目录

    • .. 表示上级目录

注意事项:路径中尽量避免使用中文



文件打开失败处理

  • 返回NULL指针表示打开失败

  • 使用perror函数输出具体错误信息

  • 及时检查返回值,避免后续操作出错



文件指针管理

  • fclose不会自动将指针置为NULL

  • 关闭后手动置空,防止野指针

  • 良好的编程习惯:关闭即置空

(敬请期待……)

http://www.dtcms.com/a/554176.html

相关文章:

  • 【22】C语言 - 二维数组详解
  • 嵌入式项目代码架构与分层笔记
  • 自己房子做民宿挂什么网站数字今天科技 网站
  • 建设ca网站aws wordpress 集群
  • Rust数据类型(上):标量类型全解析
  • BPC EPM表单常规设置
  • 关于C++递归函数和指针部分
  • 基于STM32的智能天气时钟
  • 传奇网站建设网站开发公用头部
  • 安徽省建设厅官方网站黄世山电商办公室
  • 做的网站上更改内容改怎么办科技公司logo设计图片
  • 飞腾D2000/8在Ubuntu20.04下压力测试
  • 深度学习模型部署:将 TensorFlow 模型转为 TFLite 适配移动端
  • 新版ubuntu中sac安装问题(缺少libncurses5)
  • 使用Docker搭建YApi接口管理平台
  • 建立网站的成本林州网站建设服务
  • 齐博企业网站创建网站成功案例
  • 遇见诡异的问题/闪动/闪烁/抖动展示不全可以试试 transform: translateZ(0); will-change: transform;
  • 力扣hot100从头刷----100.1环形链表
  • 吴镇宇做的电影教学网站做网站的服务器有什么作用
  • 如何将插入(insert)的记录id返回?
  • Cesium地图弹框实现方案演进:从组件化到动态挂载的技术探索
  • 归并|线段树|树状数组
  • 淘宝客网站程序模板便利的广州微网站建设
  • RAGFlow:部署、理论与实战(一)
  • 西安专业网站制作服务专门做动漫的网站有哪些
  • 使用 Python 向 PDF 添加附件与附件注释
  • 【开题答辩全过程】以 基于java的社区疫情防控系统设计与实现 为例,包含答辩的问题和答案
  • Android ble和经典蓝牙
  • 海珠区专业做网站公司wordpress基于谷歌框架