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

【C语言】知识总结·文件操作

目录

一·文件的概念

二·文件的分类

1. 文本文件(Text Files)

2. 二进制文件(Binary Files)

三·文件操作的基本步骤

 文件指针

打开文件(fopen 函数) 

文件打开模式 

关闭文件(fclose 函数) 

四·文件的读写操作

1. 文本文件读写

字符读写(fgetc/fputc)

字符串读写(fgets/fputs)

格式化读写(fscanf/fprintf)

五·文件定位与随机访问

六·错误处理

七·文件缓冲区管理

八·文件操作的最佳实践

九·总结


前言:
在 C 语言里,文件操作是很重要的内容,主要用于对外部文件进行读写操作。下面为你详细介绍 C 语言文件操作的相关知识。


一·文件的概念

文件是存储在计算机外部介质(如硬盘、U盘等)上的数据集合,可以是文本文档、图像、音频等。在C语言中,文件被视为一系列字节的序列,可以进行读写操作。文件操作依赖于标准库 <stdio.h> 中定义的 FILE 结构体和相关函数。

二·文件的分类

根据文件内容和用途的不同,文件可以分为两类:

1. 文本文件(Text Files)
  • 特点:由ASCII字符或其扩展集构成,可以使用文本编辑器打开。
  • 读写方式:使用 fscanffprintfgetcputcfgetsfputs 等函数进行读写。
  • 缓冲机制:默认是行缓冲,即在遇到换行符时才进行实际的I/O操作。
  • 优点:通用性强,易于阅读和编辑。
  • 缺点:不适合存储二进制数据,如图像、音频等。
2. 二进制文件(Binary Files)
  • 特点:以原始字节形式存储数据,如图像、音频、程序等。
  • 读写方式:使用 freadfwrite 进行块读写。
  • 缓冲机制:默认是块缓冲,适合处理大量数据。
  • 优点:存储效率高,适合处理非文本数据。
  • 缺点:无法直接用文本编辑器打开,且读写过程较为复杂。

三·文件操作的基本步骤

在C语言中,文件操作通常包括以下几个步骤:

  1. 定义文件指针:使用 FILE * 类型的变量来表示文件。
  2. 打开文件:使用 fopen 函数打开文件,指定文件名和打开模式。
  3. 读写文件:根据文件类型选择合适的读写函数(如 fprintffscanffreadfwrite)。
  4. 关闭文件:使用 fclose 函数关闭文件,释放资源。

 文件指针

在 C 语言中,进行文件操作要用到文件指针,它的类型是FILE*。文件指针就像一个 “桥梁”,通过它可以对文件进行各种操作。

FILE *fp;  // 声明一个文件指针

打开文件(fopen 函数) 

FILE *fopen(const char *filename, const char *mode);

filename指的是要打开的文件名称。

文件打开模式 

  • mode表示文件的打开模式,常见的模式有以下几种:
    • "r":以只读方式打开文件,要求文件必须已经存在。
    • "w":以写入方式打开文件,如果文件不存在就会创建一个新文件;如果文件已存在,则会清空文件内容。
    • "a":以追加方式打开文件,如果文件不存在会创建新文件,写入的数据会添加到文件原有内容的后面。
    • "r+":以读写方式打开文件,文件必须已经存在。
    • "w+":以读写方式打开文件,若文件不存在会创建新文件,不过会先清空原有文件内容。
    • "a+":以读写方式打开文件,若文件不存在会创建新文件,写入的数据会追加到文件末尾。
FILE *fp = fopen("test.txt", "r");//只读
if (fp == NULL) {perror("文件打开失败");exit(EXIT_FAILURE);
}

关闭文件(fclose 函数) 

int fclose(FILE *fp);

文件使用完毕后,一定要调用fclose函数将其关闭,这样可以释放系统资源。该函数执行成功时返回 0失败时返回 EOF。

fclose(fp);

四·文件的读写操作

1. 文本文件读写

  • 格式化读写:使用 fprintf 和 fscanf 进行格式化输出和输入。
  • 字符读写:使用 putc 和 getc 读写单个字符。
  • 字符串读写:使用 fputs 和 fgets 读写字符串。
FILE *fp = fopen("example.txt", "w");
fprintf(fp, "Hello, World!");
fclose(fp);

 

字符读写(fgetc/fputc)
  • fgetc:从文件中读取一个字符。
int fgetc(FILE *fp);

示例:

int ch;
while ((ch = fgetc(fp)) != EOF) {printf("%c", ch);
}

 fputc:向文件中写入一个字符。

int fputc(int c, FILE *fp);

 示例;

fputc('A', fp);

 

字符串读写(fgets/fputs)

fgets:从文件中读取一行字符串。

char *fgets(char *str, int n, FILE *fp);

    示例: 

char buffer[100];
fgets(buffer, 100, fp);

 fputs:向文件中写入一个字符串。

int fputs(const char *str, FILE *fp);

      示例:

fputs("Hello, World!\n", fp);
格式化读写(fscanf/fprintf)
  • fscanf:从文件中按照指定格式读取数据。

    int fscanf(FILE *fp, const char *format, ...);
    
    示例:
    int num;
    fscanf(fp, "%d", &num);
    

  • fprintf:按照指定格式向文件中写入数据。

    int fprintf(FILE *fp, const char *format, ...);
    
    示例:
    fprintf(fp, "%d %s", 10, "apple");

 

五·文件定位与随机访问

C语言提供了以下文件定位和随机访问函数:

  1. fseek:移动文件指针到指定位置
  2. ftell:获取当前文件指针位置
  3. rewind:将文件指针重置至文件起始位置
  • 示例代码
    FILE *fp = fopen("data.bin", "rb");
    fseek(fp, 10, SEEK_SET); // 将指针移动到第10个字节
    fclose(fp);

六·错误处理

在文件操作中,可能会遇到各种错误,如文件不存在、权限不足等。C语言提供了以下函数用于错误处理:

  • feof:检测是否到达文件末尾。
  • ferror:检测是否发生读写错误。
  • perror:打印错误信息。
  • 示例代码
    FILE *fp = fopen("example.txt", "r");
    if (fp == NULL) {perror("Error opening file");return 1;
    }
    fclose(fp);

七·文件缓冲区管理

在 C 语言里,文件操作一般借助缓冲区来提升 I/O 效率。缓冲区有行缓冲、块缓冲和无缓冲这几种类型。一般来说,文本文件采用行缓冲,二进制文件则使用块缓冲。要是你想手动设置缓冲区,可以使用setvbuf函数。

八·文件操作的最佳实践

  1. 及时关闭文件:文件用完后,要马上用fclose释放文件资源,防止出现资源泄漏的情况。
  2. 合理使用ferrorclearerr:利用ferror检测文件操作过程中是否有错误发生,通过clearerr清除错误状态,让文件操作能够继续正常进行。
  3. 避免使用gets函数gets函数在读取输入时不会检查缓冲区的大小,很容易造成缓冲区溢出,引发安全问题,所以要尽量避免使用它。
  4. 适时使用fflush函数:往文件写入数据后,调用fflush函数刷新缓冲区,这样能保证数据真正写入磁盘,防止数据丢失。
  5. 灵活运用removerename函数remove函数可以用来删除不再需要的文件,rename函数则能对文件进行重命名,方便文件的管理。

九·总结

在 C 语言中,文件操作是处理持久化数据的一项基础技能。通过 C 语言标准库提供的一系列函数,我们能够轻松实现文件的打开、读写、关闭以及错误处理等操作。要想编写出高效、安全的程序,就必须掌握文件操作的基本概念、文件的分类、不同的读写方式、文件定位与随机访问方法以及错误处理等知识点。当然,仅仅了解这些理论知识是不够的,还需要通过实际的编程练习,不断加深对文件操作的理解和应用能力,从而在实际开发中能够熟练、灵活地运用文件操作相关知识。

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

相关文章:

  • Redis在项目中的使用
  • 在移动端使用 Tailwind CSS (uniapp)
  • 在项目架构时,如何选择打包构建工具?
  • Nginx、Spring Cloud Gateway 与 Higress 的应用场景及核心区别
  • Linux基本命令篇 —— alias命令
  • AI专业化应用加速落地,安全治理挑战同步凸显
  • 车载软件架构 -- SOA服务分层设计原则
  • 数学建模_非线性规划
  • 时钟(6.25-26)
  • pppoe宽带连接-系列命令调用
  • 使用Process Monitor定位benchstat工具执行过程
  • Almalinux_10.0下MySQL的多表操作与函数使用
  • 智慧城市的安全密码:商用密码如何守护万物互联?
  • 鸿蒙自定义相机的拍照页面
  • 荧光原位杂交(FISH)-实验操作-011
  • LeetCode[617]合并二叉树
  • 从SEO到GEO:AI时代的品牌大模型种草与数字营销重构
  • 【记录】基于 C++ 和 Winsock 的简单 TCP 通信实现
  • 健康医疗类Agent推荐有哪些
  • 下载公开的dahiti全球水位数据
  • 通过异步解决超时问题-使用 Spring 的 @Async 实现异步调用
  • Python毕业设计230—基于python+爬虫+vue的豆瓣影视数据可视化系统(源代码+数据库+15000字论文+开题+答辩ppt)
  • 构建灵活的监控系统:多表存储与动态告警规则设计实践
  • 智能防御原理和架构
  • dial tcp 10.1.68.88:3306: connect: cannot assign requested address
  • 中心化钱包安全方案
  • 跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议​​
  • Kotlin Data包含ByteArray类型
  • Dify 工作流全栈解析:从零构建你的 AI 应用流程引擎
  • 如何看待RWA赛道