C语言-文件操作
1.什么是文件
在 C 语言里,文件本质是存储在外部介质(硬盘、U 盘等)上的一组有序数据集合,操作系统会给它分配文件名,用来长期保存数据。
在程序设计中,我们常谈的文件有两种:程序文件、数据文件。
1.1 程序文件
存放代码、指令的文件,作用是告诉计算机要做什么,计算机读取里面的指令来运行、执行任务
例如:.c .h .exe .com 等
1.2 数据文件
专门存放业务数据、运行结果、内容资料的文件,本身不能独立运行,只能被程序读取、修改、保存,作用是存储程序需要处理 / 产生的内容
数据文件又分:文本型数据文件和二进制数据文件
1.2.1文本型数据文件
用字符编码存储,可读,比如:
.txt 纯文本、.csv表格数据、.log日志文件
1.2.2二进制数据文件
按数据原始二进制存储,体积小、读写快,比如:
.dat、图片 .jpg 、音频 .mp3
1.3文件名
一个文件对应一个唯一的文件名,所以同一路径下不可能出现同名文件

文件路径又分为绝对路径和相对路径:
1.3.1绝对路径和相对路径
1.3.1.1绝对路径
从磁盘根目录开始,完整描述文件位置的路径,唯一、固定,不受当前程序所在位置影响。
1.3.1.2相对路径
不以根目录开头,以程序当前所在目录为参照来找文件,路径简短,依赖运行位置。
2.C语言的流
流的定义:在C语言中,“流”是一种用于输入和输出数据的抽象概念。它是一种数据的传输方式,可以将数据从一个地方传送到另一个地方。在C语言中,输入流和输出流是通过一组标准库函数来实现的,这些函数允许程序从键盘或文件中读取数据,或者将数据写入到屏幕或文件中。
流可分为 标准流 和 文件流
2.1标准流
标准输入流(stdin):用于读取输入数据,默认情况下是键盘输入。
标准输出流(stdout):用于向终端或命令行窗口输出数据。
标准错误流(stderr):用于输出错误信息。
2.2文件流
C语言中的文件流是一种用于在程序中读取和写入文件的流。通过文件流,可以在C程序中打开文件,从文件中读取数据或将数据写入文件中。这样可以有效地处理大量数据、持久性存储以及与文件系统的交互。
3.文件的打开和关闭
3.1文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE。
我们一般通过一个FILE的指针来维护这个FILE结构的变量
FILE * pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变 量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联文件。
3.2 文件的打开和关闭
在使用文件之前应该打开文件,使用完之后应该关闭文件
ANSIC规定用fopen来打开文件,用fclose来关闭文件
FILE * fopen ( const char * filename, const char * mode ); //打开文件
int fclose ( FILE * stream ); //关闭文件
打开方式如下:
| 文件使用方法 | 含义 | 如果指定文件不存在 |
| "r"(只读) | 为了输入数据,打开一个文本文件 | 出错 |
| "w" (只写 | 为了输出数据,打开一个文件文本 | 建立一个新的文件 |
| "a" (追加) | 向文本文件尾部添加数据 | 建立一个新的文件 |
| "rb" (只读) | 为了输入数据,打开一个二进制文件 | 出错 |
| "wb"(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
| "ab"(追加) | 向一个二进制文件尾添加数据 | 出错 |
| "r+"(读写) | 为了读和写,打开一个文本文件 | 出错 |
| "w+"(读写) | 为了读和写,建立一个新的文本文件 | 建立一个新的文件 |
| "a+"(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
| "rb+"(读写) | 为了读和写,打开一个二进制文件 | 出错 |
| "rw+"(读写) | 为了读和写,建立一个新的二进制文件 | 建立一个新的文件 |
| "ab+"(读写) | 打开一个二进制文件,在文件尾进行读写 | 建立一个新的文件 |
3.3 文件的随机读写
| 功能 | 函数名 | 适用于 |
| 字符输入函数 | fgetc | 所有输入流 |
| 字符输出函数 | fputc | 所有输出流 |
| 文本输入函数 | fgets | 所有输入流 |
| 文本输出函数 | fputs | 所有输出流 |
| 格式化输入函数 | fscanf | 所有输入流 |
| 格式化输出函数 | fprintf | 所有输出流 |
| 二进制输入 | fread | 文件 |
| 二进制输出 | fwirte | 文件 |
fgetc函数
- 返回文件指针当前指向的字符,然后文件指针向后移动一位
- 如果文件指针位于文件末尾,那么就返回EOF,并为流设置 (feof) 的文件结束指示器
- 如果文件读取错误,同样返回EOF,但改为设置其错误指示器 (ferror)

fputc函数
- 将一个字符写入文件,然后文件指针向后移动一位
- 如果写入成功,那么返回这个字符的ASCII值
- 如果发生错误,则返回EOF


fgets函数


fscanf函数

fprintf函数


fread函数


可能有小伙伴不理解为什么是这个结果,我们一起来分析:
我们知道,fread是以二进制的形式读取文件中的信息,而文件中的1200是文本信息,每个字符对应的ASCII码为49,50,48,48,转换为二进制码:0011 0001 0011 0010 0011 0000 0011 0000,二进制再转换成十进制就是808464845
fwrite函数

fseek函数
根据文件指针的位置和偏移量来定位
int fseek ( FILE * stream, long int offset, int origin );
例如:


在test文件输出“I am good boy"使用fseek函数定位到第10个字符,然后将”girl"替换过去
ftell函数
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream );
例如:

4.文件读取结束的判断
牢记:在文件读取的过程中,不能使用feof函数的返回值直接来判断文件是否结束
feof的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件末尾
文本文件读取是否结束:
fgetc判断返回值是否为EOF
fgets判断返回值是否为NULL
二进制文件读取是否结束:
fread判断返回值是否小于实际要读的个数
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)