前言
本节课讲的是文件操作
提示:以下是本篇文章正文内容,下面案例可供参考
一、文件操作的大概过程
文件及文件操作介绍
什么是文件? 磁盘中的各种文件,图片文件(jpg,png,bmp,gif…),文本(doc,txt,dot,rtf,doct,wps,wpt, pdf,c,cpp,html,css,py…),其他(zip,7z,exe,msi,dll,lib,apk…)无数种文件类型,这些都是文 件,文件操作就是操作这些文件
不同的文件区别? 不同的文件存储的数据类型不同,文件内存储数据的格式不同
流程:操作流程:打开文件,读写操作,关闭文件
二、打开与关闭文件
打开文件:FILE * = fopen(“文件路径”,打开模式):旧 与errno_t = fopen_s(FILE*,“文件路径”,“打开模式”)函数:新
//打开文件 //旧 FILE* pile1 = fopen("mytxt.txt", "r"); //参数1:文件的路径(绝对/相对)参数2:打开方式 //新 FILE* pfile2 = NULL;//新版是通过传址调用,所以需要先定义FILE类型的指针 errno_t e = fopen_s(&pfile2, "mytxt2.txt", "r");//参数1为传址调用,其他不变
FILE* 文件指针介绍:
FILE:文件类型,,就是文件指针,打开文件的本质就是将文件内容存进文件缓冲区,FILE 可以理解为文件缓冲区首地址。随着操作,文件指针偏移,指向哪儿就从哪儿开始操作。 返回值:旧函数直接返回文件操作地址。新函数通过参数 1 的传址调用获得文件地址
文件路径介绍:
相对路径:默认相对于项目文件所在目录,写个名字即可
绝对路径:完整路径名
打开方式介绍
文本模式: "r"/"rt" 只读,只能调用读函数,文件必须存在,否则失败。文件指针指向头字节。 "r+" 可读可写读,读写函数都能调用,文件必须存在,否则失败。文件指针指向头字节。 "w"/"wt" 擦除写,只能调用写函数,文件不存在时创建文件。文件指针指向头字节。 "w+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向头字节。 "a"/"at" 附加写,只能调用写函数,文件不存在时创建文件。文件指针指向尾字节。 "a+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向尾字节。 二进制模式: "rb" 只读,只能调用读函数,文件必须存在,否则失败。文件指针指向头字节。 "rb+" 可读可写读,读写函数都能调用,文件必须存在,否则失败。文件指针指向头字节。 "wb" 擦除写,只能调用写函数,文件不存在时创建文件。文件指针指向头字节。 "wb+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向头字节。 "ab" 附加写,只能调用写函数,文件不存在时创建文件。文件指针指向尾字节。 "ab+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向尾字节。
二进制模式与文本模式的区别:对文件行结尾代码层面处理不同,在 windows 系统中,行结尾是\r\n,文本模式读到的是\n,二 进制模式读到的是\r\n 在 linux 系统下都是\n,没有区别。
fopen_s返回值介绍:
类型为erron_t
如果他的返回值不为0,则打开文件失败
if(e!=0&&pfile==NULL)//判断文件指针是否为NULL也是一种方法 { printf("文件打开失败\n"); }
关闭文件:fclose(FILE*)
为什么要关闭文件?
默认情况下不能打开两次
fclose(pfile);
三、读写操作fputc、fgetc、feof
fputc、fgetc
写入一个字节:int = fputc(字符,文件指针)
.int a = fputc('a', pfile2);//把参数1写入参数2的文件中,返回ascii整数
读取一个字节int = fgetc(文件指针);
.int b = fgetc(pfile2);//读取参数中一个字符,文件指向向下移动1格
返回值为读取出的字符的ascii整数,使用"%c"打印
注意:注意:取用r 写用a/w
int a = fputc('a', pfile2);//把参数1写入参数2的文件中,返回ascii整数 int b = fgetc(pfile2);//读取参数中一个字符,文件指向向下移动1格
feof
当读到文件结尾时,返回真
bool = feof(文件指针);
循环读文件
while (1) { int a = fgetc(pFile); if (feof(pFile)) break; putchar(a); }
四、读写操作fputs、fgets
写入n个字节:fputs(要写入的字符串,文件指针)
读取n个字节:fgets(存储读取出来的字符串,读出的字节数,文件指针);
//读取n个字符 fputs("hello 文件操作", pfile2);//写入参数1到文件中 char str[20] = { '\0' }; fgets(str, 20, pfile2);//读取文件20个字符,存到str中
五、格式化读写字符串 fprintf,fscanf,fscanf_s
格式化写入字符串:fprintf(文件指针,“输出格式符”,数据) 把数据格式化后写入文件指针中,输出格式符要对应数据
格式化读取字符串:fscanf(文件指针,“输入格式符”,存储变量);
fscanf_s()---->与scanf和scanf_s的区别一样,字符串需要写字节数
//写 fprintf(pfile2, "a:%d, b:%lf,s:%s", 12, 45.6, "hello c3"); //格式化字符串写入文件 //读 int a = 0; double b = 0.0; char str[20] = { 0 }; fscanf_s(pfile2, "a:%d, b:%lf,s:%s", &a, &b, str, 20); //成对使用,新版 fscanf(pfile2, "a:%d, b:%lf,s:%s", &a, &b, str); //老版 //注意:读和写的格式化字符要对应
注意:读和写的格式化字符要对应,很重要,要不然会读乱
六、二进制读写数据fread、fwrite
什么场景使用他们:都是数据的时候
为什么要使用他们:比如 12 这个整数,前三组就是存入的字符 1 2 。而最后一组存 00001100 存入 1 字节。 所以数值类型的数据存储,可以直接使用 fread fwrite,比前三者效率高,因为前三者要 先转换,然后存
写入:fwrite(写入数据的地址,大小,写入的次数,文件指针);
读取:fread(存储数据的地址,大小,读取的次数,文件指针);
struct Node { int a; double b; char c[10]; }; //写入结构体node struct Node node = { 10,20.22,"你好" }; fwrite(&node, sizeof(node), 1, pfile2);//写入的结构体地址、结构体大小,写入的次数,文件指针 //fread读取二进制到程序中 //读取结构体node struct Node read_node; fread(&read_node, sizeof(read_node), 1, pfile2);//取出的结构体地址、结构体大小,读出 的个数的次数,文件指针 //打开文件看到的就是乱码了,但是在程序中看就是写入的东西了
七、文件操作函数
rewind
将文件指针指向文件首:
rewind(文件指针)
ftell
返回文件指针指向的文件中的字节下标
long = ftell(文件指针)
返回值为long类型,他为文件指针指向的下标
fseek
设置文件指针指向哪个字节,成功返回 0
fseek(文件指针,相对位置,从哪开始走)
参数3详解:
SEEK_SET 文件首,配合参数 2,比如 3,就是首+3 的位置,即第四个字节 SEEK_END 文件尾,配合参数 2,比如-3,就是结尾-3 的位置,即倒数第四个字节 SEEK_CUR 当前位置,配合参数 2,负数左移,正数右移。
大家可以挑选自己需要的使用
总结
本文讲了:打开文件、路径是什么、打开模式的挑选、读写的几种方式(fputc、fgetc、fputs、fgets、fprintf、fscanf、fscanf_s以及二进制读写fread、fwrite)、文件操作函数(rewind、ftell、fseek)