前言
- 文件操作
在运行程序的时候,此时数据是存放在内存中,当程序退出的时候,程序中的数据自然就不存在了,等下次运行程序的时候,数据又得重新录入,我们可以用文件的办法,把程序中的数据保存下来,只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。
文件指针:
向文件里输出或读取数据需要使用文件指针的形式,每个文件指针可以用来打开一个文件,这个文件指针指向文件的文件信息区。
FILE * 变量名 🌞
文件的打开和关闭:
文件使用完之后要记得关闭,不让会占用资源,文件关闭掉之后要记得把指针置空以免出现野指针
//打开文件 FILE * fopen ( const char * filename, const char * mode ); //关闭文件 int fclose ( FILE * stream );
文件的打开方式
文件使用方式 | 文件使用方式 | 如果指定文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
代码示例
#include <stdio.h> int main() { FILE *pf = fopen("test.txt",'w'); if(pf==NULL) { perror("FOPEN:"); //对文件指针进行判断以免返回空指针; } fput("haohaoxuexi,tiantianxiangshang",pf); fclose(pf); pf=NULL; //文件关闭之后把指针置为空,以免出现野指针 }
‘ w ’ 没有文件的情况下会新建一个文件在此程序文件夹下,可以看到文件已经生成了。
在这里插入图片描述
文件读写函数
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
二进制方式存储文件
二进制存储在文件内是查看不到具体信息的,要想在文件内查看具体信息要选择其他函数。
二进制形式存储代码示例
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <malloc.h> struct student { char name[20]; int age; char adress[20]; }*s1; int main() { s1 = (struct student*)malloc(sizeof(struct student)); if (s1 == NULL) { perror("malloc:"); return 0; } FILE* pf = fopen("test.txt", "wb"); if (pf == NULL) { perror("FOPEN:"); //对文件指针进行判断以免返回空指针; return 0; } strcpy(s1->name, "陈独秀"); s1->age = 18; strcpy(s1->adress,"东城区箭杆胡同20号"); fwrite(s1, sizeof(struct student), 1, pf); fclose(pf); pf = NULL; }
结果:
可以看到文件已经出现了部分乱码,还能看到文字的原因是文本文件打开的时候默认以一种编码形式打开,将本来存到文本里的二进制信息进行了解码。
对文件进行拷贝
这里要注意\需要再用\转义,否则是转义字符的意思
- 先打开要拷贝的文件,再打开新建拷贝后的文件进行拷贝
- 如果是图片视频等文件,要使用二进制的方式打开、读取和存储,否则文件会损坏
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <malloc.h> int main() { FILE* pfr = fopen("C:\\Users\\22763\\Pictures\\Saved Pictures\\QQ图片20211001085735.jpg", "rb"); //要拷贝的文件目录 FILE* pfw = fopen("CopyPic.jpg", "wb"); char temp; if (pfw == NULL||pfr==NULL) { perror("FOPEN:"); //对文件指针进行判断以免返回空指针; return 0; } while (fread(&temp, sizeof(char), 1, pfr)) { fwrite(&temp, sizeof(char), 1, pfw); } fclose(pfw); fclose(pfr); pfw = NULL; pfr = NULL; }
文件随机读写函数
- 这三个函数并不常用,所有只要知道有这三个函数就行了以及他们是干什么的就可以了,用的时候再查。
fseek
int fseek(FILE stream,long offset,int origin );
根据文件指针的位置和偏移量来定位文件指针。
ftell
long ftell( FILE *stream );
返回文件指针相对于起始位置的偏移量
rewind
void rewind( FILE *stream );
让文件指针的位置回到文件的起始位置
文件缓冲区
文件在读或者写的时候存在一个文件缓冲区,因为与磁盘交互,需要一定时间(尽管很短),但是为了尽可能的节省时间,系统自动地在内存中设立了文件缓冲区,等攒够一定的数据,或者程序结束,一起读或写,这样大大提高读写速度,避免每个字符都要进行一次读或写。
删除线格式
撒花
这就是文件操作的全部内容了,创作不易,还请各位小伙伴多多点赞👍关注收藏⭐,以后也会更新各种小游戏还有关于c语言的博客,撒花!