7 文件操作
约 3087 字大约 10 分钟
2025-06-22
概念
文件就是存放在磁盘上的一些数据的集合
分类
磁盘文件:(我们通常认识的文件)
指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。
一个文件通常是磁盘上一段命名的存储区计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储
从用户或者操作系统使用的角度(逻辑上)把文件分为:
文本文件:基于字符编码的文件
常见编码有 ASCII、UNICODE 等一般可以使用文本编辑器直接打开 例如:数5678 的以ASCII 存储形式为:ASCI码: 00110101 00110110 00110111 00111000
二进制文件:基于值编码的文件
基于值编码,根据具体应用,指定某个值是什么意思一般需要自己判断或使用特定软件分析数据格式 例如:数 5678 的存储形式为:二进制码:00010110 00101110
音频文件(mp3):二进制文件 图片文件(bmp)文件,一个像素点由两个字节来描述*****######&&&&&,565∗代表红色的值R#代表绿色的值 G &代表蓝色的值 B
文本文件、二进制文件对比:
译码:
文本文件编码基于字符定长,译码容易些; 二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式,一般需要特定软件进行译码)。
空间利用率:
二进制文件用一个比特来代表一个意思(位操作) 而文本文件任何一个意思至少是一个字符。空间利用率高
可读性:
文本文件用通用的记事本工具就几乎可以浏览所有文本文件 二讲制文件需要一个具体的文件解码器,比如读 BM 文件,必须用读图软件 视频文件需要视频播放器
总结:
1、文件在硬盘上存储的时候,物理上都是用二进制来存储的 2、咱们的标准 io 库函数,对文件操作的时候,不管文件的编码格式(字符编码、或二进制),而是按字节对文件进行读写,所以咱们管文件又叫流式文件,即把文件看成一个字节流。
设备文件:
输出等同于在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、:对磁盘文件的读和写。
标准io库函数对磁盘文件的读取特点
VS 中对普通文件的读写是全缓冲的。
全缓冲
标准 io 库函数 ,往普通文件读写数据的,是全缓冲的
刷新缓冲区的情况
1.缓冲区满了,刷新缓冲区 2.调用函数刷新缓冲区 fush(文件指针) 3.程序结束 会刷新缓冲区
文件指针
文件指针在程序中用来标识(代表)一个文件的,在打开文件的时候得到文件指针,文件指针就用来代表打开的文件。
对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即将文件指针,传给读、写、关闭等函数,那些函数就知道要对哪个文件进行操作。
定义文件指针
FILE* 指针变量标符; FILE 为大写,需要包含<stdio.h>
FILE 是系统使用 typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息
般情况下,我们操作文件前必须定义一个文件指针标识 我们将要操作的文件实际编程中使用库函数操作文件,无需关心FILE 结构体的细节 ,只需要将文件指针传给 io 库函数库函数再通过 FILE 结构体里的信息对文件进行操作
FILE 在 stdio.h 文件中的文件类型声明:
typedef struct{
short level; //缓冲区“满”或“空”的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned charhold; //如无缓冲区不读取字符
short bsize; //缓冲区的大小
unsigned char *buffer; //数据缓冲区的位置
unsigned ar*curp; //指针,当前的指向
unsigned istemp; //临时文件,指示器
shorttoken; //用于有效性检查
}FILE;
在缓冲文件系统中,每个被使用的文件都要在内存中开辟一块FILE 类型的区域存放与操作文件相关的信息
文件打开和关闭
对文件操作的步骤:
1、对文件进行读写等操作之前要打开文件得到文件指针 2、可以通过文件指针对文件进行读写等操作 3、读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了
补充:
c 语言中有三个特殊的文件指针无需定义,在程序中可以直接使用
stdin: 标准输入 默认为当前终端(键盘)
我们使用的scanf、getchar函数默认从此终端获得数据
stdout: 标准输出默认为当前终端(屏幕)
我们使用的 printf、puts 函数默认输出信息到此终端
stderr:标准错误输出设备文件 默认为当前终端(屏幕)
当我们程序出错使用:perror 函数时信息打印在此终端
fopen
函数的声明:
FILE * fopen(const char * path, const char * mode);
打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,然后返回文件的标示。
返回值: 成功:打开的文件对应的文件指针 失败:返回 NULL 调用 fopen,函数的时候,一定要判断一下,打开是否成功
函数的参数:
参数 1:打开的文件的路径
1、绝对路径,从根目录开始的路径名称 "D:\\demo\\test\\aaa.txt"
2、相对路径 test\\aaa.txt
参数 2:文件打开的方式
即以什么样的方式(只读、只写、可读可写等等)打开文件
第二个参数的几种形式(打开文件的方式)
读写权限:r w a +
r:以只读方式打开文件 文件不存在返回 NULL; 文件存在,且打开文件成功,返回文件指针,进行后续的读操作
例
FILE* fp;
fp=fopen("test.txt","r");
w:以只写方式打开文件 1、文件不存在,以指定文件名创建此文件,并且打开文件; 2、若文件存在,清空文件内容,打开文件,然后进行写操作; 3、如果文件打不开(比如文件只读),返回 NULL
a:以追加方式打开文件 1、文件不存在,以指定文件名创建此文件(同 w) 2、若文件存在,从文件的结尾处进行写操作
如果不加 a 的话,打开文件的时候读写位置在文件的开始,对文件进行读写的时候都是从文件开始进行读写的。 如果加 a,打开已经存在的文件,读写位置在文件的末尾。
打开方式
带b的都是当作二进制文件打开
r以只读方式打开一个文本文件不创建文件 rb把文件当作二进制文件打开 r+以可读、可写的方式打开文件(不创建新文件) rb+
w以写方式打开文件(使文件长度截断为 0 字节,创建一个文件) wb w+以可读、可写的方式打开文件(使文件长度为 0 字节,创建一个文件) wb+
a以追加方式打开文件,即在末尾添加内容,当文件不存在时,创建文件用于写 ab a+以添加方式打开文件,打开文件并在末尾更改文件(如果文件不存在,则创建文件) ab+
fclose
函数的声明:
int fclose(FILE * fp);
函数的说明:
关闭 fp 所代表的文件 一个文件只能关闭一次,不能多次关闭。关闭文件之后就不能再文件指针对文件进行读写等操作了
返回值: 成功返回0 失败返回非0 可以通过返回值,来判断关闭文件是否成功。
读写字符
fgetc
函数声明:
int fgetc(FILE * stream);
函数说明:
fgetc 从 stream 所标识的文件中读取一个字节,将字节值返回
返回值:
以t的方式:读到文件结尾返回 EOF 以 b的方式:读到文件结尾,使用 feof(文件指针)判断结尾
feof是 C 语言标准库函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束则返回非0值,否则返回 0(即,文件结束:返回非0值;文件未结束:返回0值)。
fputc
函数的声明:
int fputc(int c, FILE * stieam);
函数的说明:
fputc将 c的值写到 stream 所代表的文件中。也可以是stout(屏幕上)
返回值: 如果输出成功,则返回输出的字节值 如果输出失败,则返回一个 EOF。
EOF 是在 stdio.h 文件中定义的符号常量,值为-1
注意:打开文件的时候,默认读写位置在文件的开始,如果以 a 的方式打开读写位置在文件的末尾向文件中读取字节或写入字节的时候,读写位置会往文件的末尾方向偏移,读写多少个字节,读写位置就往文件的末尾方向偏移多少个字节
fgets
char * fgets(char * s,int size, FILE * stream);
从 stream 所代表的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了 size-1个字节停止读取,在读取的内容后面会加一个\0,作为字符串的结尾
返回值: 成功返回目的数组的首地址,即 s 失败返回 NULL
fputs
int fputs(const char * s, FILE * stream); 函数功能: 将s 指向的字符串,写到 stream 所代表的文件中 返回值: 成功返回写入的字节数 失败返回 -1
读写文件
fread
函数的声明:
size t fread(void * ptr, size t size, size t nmemb, FILE * stream);
函数的说明:
fread 函数从 stream 所标识的文件中读取数据,每块是 size 个字节,共memb 块,存放到 p 指向的内存里
返回值:
实际读到的块数
fwrite
函数的声明:
size t fwrite(void * ptr, size_t size, size t nmemb, FILE * stream);
函数的说明:
fwrite 函数将pt 指向的内存里的数据,向 stream 所标识的文件中写入数据,每块是 size 个字节,共nmemb 块。
返回值: 实际写入的块数
随机读写
rewind 复位读写位置
定义
void rewind(文件指针)
函数功能
把文件内部的位置指针移到文件首调用形式
调用方式
rewind(文件指针)
ftell 测文件读写位置距文件开始有多少个字节
定义函数:
long ftel1(文件指针);
函数功能:
取得文件流目前的读写位置
返回值:
返回当前读写位置(距离文件起始的字节数),出错时返回-1.
fseek 定位位置指针(读写位置)fseek 函数 (一般用于二进制文件即打开文件的方式需要带 b)
函数声明:
int fseek(FILE * stream, long offset, int whence);
//int fseek(文件类型指针,位移量,起始点);
函数功能:
移动文件流的读写位置
参数:
whence 起始位置 文件开头 SEEK SET 0 文件当前位置 SEEK CUR 1 文件末尾 SEEK END 2
位移量:
以起始点为基点,向前、后移动的字节数,正数往文件末尾方向偏移,负数往文件开头方向偏移。
贡献者
版权所有
版权归属:PinkDopeyBug