🏠 一.引言
我们日常生活中会将我们制作的ppt,word等存放在文件里进行归类,你是否知道我们能用cC语言对文件进行操作呢(比如文件的打开,关闭和读写等)?那接下来跟博主一起来学习下吧。
🏠二.什么是文件
磁盘上的文件就是文件,可以理解为一个信息集合体。我们一般根据文件的功能将其分为两类:一类是程序文件,一类是数据文件。
◕‿◕文件名
文件名相当于是一个标志,⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
小补充:1.文件名可以不包含后缀名,比如.txt文件类型,显示文件扩展名就可以看到
2.文件名后缀表示文件的默认打开方式
3.文件名有一些非法字符,如\ / : * ? " < > |
1.程序文件
程序文件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。
2.数据文件
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
数据文件分类
数据文件按数据的组织形式,一般分为二进制文件和文本文件。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存,就是⼆进制⽂件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
🏠三.对文件的操作
类比我们平时喝汽水我们常规步骤是打开瓶子,喝汽水,最后再关闭瓶子。类似地,我们对文件的操作首先是要打开文件,对文件进行输入或输出,最后再关闭文件。我们先来细🔒打开文件和关闭文件。
在介绍打开与关闭文件之前,我们先来普及一个概念叫做流。
1.流
流的源来:我们对一个文件可以将他输入屏幕/另一个文件等等不同的设备,这个时候不同设备对你的要求不同。好比一个工厂,我们需要多条生产线,一条分装这种产品,另一条分装那一种产品....我们的流就好比一条生产线分出的多个岔口这些岔口指向不同设备。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的.⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
1.1标准流
1.2文件指针
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;
2.文件的打开与关闭
基于之前的理解,我们是用一个文件指针来对文件进行间接维护和操作,所以我们可以推出FILE*类型指针是我们对文件进行读写等操作所必备的,因此我们就可以理解fopen的工作原理了
fopen 这是用来打开文件的函数原型如下
int main()
{FILE* pf=fopen("data.txt","w");if (pf == NULL){perror("fopen");return 1;}fclose(pf);pf = NULL;return 0;
}
文件打开后我们当然要用比如进行读写,fopen第二个参数就是打开方式
注意:对于一个没有存在的文件直接进行读会报错。
3.文件的顺序读写
我们知道文件里内容是有光标的,顺序读写就指的是这个光标一直往后推进
一些顺序顺序读写函数
注意:fread和fwrite只适用于文件流
3.1fgetc和fputc
从函数名可以看出putc是放一个字符,getc是读一个字符
3.2 fgets和fputs函数
注意:fgets是从流中读取num-1个字符因为还要给\0留位
int main()
{FILE* pf = fopen("data2.txt", "r");if (pf == NULL){perror("fopen");return 1;}/*char arr[20] = "abcdef";fputs(arr, pf);*/char name[20] = "xxxxxxxxxxxx";fgets(name, 7, pf);printf("%s\n",name);fclose(pf);pf = NULL;return 0;
}
3.3 fscanf和fprintf函数
struct S
{char name[20];int age;float score;
};int main8()
{struct S s = { 0 };FILE* pf = fopen("dataa.txt", "r");//打开文件if (pf == NULL){perror("fopen");return 1;}//读文件 注意取址符&fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//读pf中数据到结构体//写入fprintf(stdout, "%s %d %.1f\n", s.name, s.age, s.score);//将结构体写入到标准输出流//关闭文件fclose(pf);pf = NULL;return 0;
}
3.4 fwrite和fread
这两个文字是针对二进制文件的,也就是他的读写都是针对二进制。
struct S
{char name[20];int age;float score;};
int main()
{struct S s = { "zhangsan",18,99.6 };FILE* pf = fopen("dataa1.txt", "wb");//二进制写入if (pf == NULL){perror("fopen");return 1;}fwrite(&s, sizeof(s), 1, pf);fclose(pf);pf = NULL;return 0;
}
4.文件的随机读写
我们前面知道顺序指的是光标,那我们能不能让光标随便动读写我们想要的呢?这时就要用到我们的随机读写函数。随机指的是你指哪打哪
4.1 fseek函数
fseek是根据根据⽂件指针的位置和偏移量来定位⽂件指针
4.2 ftell
4.3 rewind
当我们不知道光标在哪想从头来过就可以用rewind让⽂件指针的位置回到⽂件的起始位置
int main2()
{FILE* pf = fopen("data2.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = 0;ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);//fseek(pf, -3, SEEK_CUR); 从当前位置//fseek(pf, 3, SEEK_SET); 从开头fseek(pf, -4, SEEK_END); // 从末尾ch = fgetc(pf);printf("%c\n", ch);long size = 0;size = ftell(pf);//返回现在光标距起始位置的偏移量printf("当前偏移量离起始位置为%ld\n", size);rewind(pf);//使光标回到开头ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
🏠四.文件读取结束的判定
2.ferror
他的作用是判断在文件读取结束后,是否因为遇到错误而结束。
好了本次分享结束啦,喜欢的话给博主来个三连吧~๑ᵒᯅᵒ๑