为什么要使用文件呢? 因为我们的数据写到文件里可以持久化,会一直保留着
比如我们做一个通讯录系统每次打开就得重新输入信息,我们就可以使用文件输入信息实现可持久化,这样下次打开数据就不会消失了
首先了解 一下文件指针:每个被使用的文件都在内存中开辟了一个相应的文件信息区,这些信息区是用来存放文件相关的信息(比如文件名,文件的状态,文件的位置等等)。这些文件是保存在一个结构体变量中的,那这个结构体类型是由系统声明的,并且取名叫做
FILE。
每当打开一个文件的时候,系统会根据文件情况自动去创建一个FILE结构的变量,并填充其中的信息,使用者不必关系细节,一般都是通过一个FILE的指针来维护这个FILE结构的变量,使用起来会更加方便。
创建一个FILE*的指针变量:
FILE* pf;
定义pf是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区(是一个结构体变量),通过该文件信息区的信息就可以访问该文件,也就是说:
通过文件指针变量可以找到与它相关联的文件。
FILE* fopen(const char*filename,const char* mode) 一个是文件名 一个是打开文件的方式
字符输入函数 fgetc 适用于所有输入流
字符输出函数 fputc 适用于所有输出流
文本行输入函数 fgets 适用于所有输入流
文本行输出函数 fputs 适用于所有输出流
格式化输入函数 fscanf 适用于所有输入流
格式化输出函数 fprintf 适用于所有输出流
二进制输入 fread 适用于文件
二进制输出 fwrite 适用于文件
/*
* 只有一个C程序运行起来,这三个流就会默认开启 类型为FILE*
标准输入流 stdin(键盘)
标准输出流 stdout(屏幕)
标准错误流 stderr(屏幕)
*/
比如:FILE* pf = fopen(“test.txt”,”r”); 读文件test.txt的内容 如果文件不存在则打开失败 返回NULL
//可以使用绝对路径或者相对路径
//FILE* pf = fopen(“test.txt”, “w”); //写文件
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
写文件
//char ch = ‘a’;
//for (ch; ch <= ‘z’; ch++) {
// fputc(ch, pf);//写a到z–>(ch)到pf这个流当中
//}
关闭文件
//fclose(pf);
//pf = NULL;
//FILE* pf = fopen(“test.txt”, “r”); //读文件
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
读文件
//int ch = 0;
//while ((ch=fgetc(pf)) != EOF) { //从ch中读出所有的字符
// printf(“%c “, ch);
//}
关闭文件
//fclose(pf);
//pf = NULL;
//fgetc和fputc是字符输入和字符输出函数 面对的是一个字符
以上都是以一个字符为单位的 我们想读一行或者写一行的话就要使用fputs,fgets
打开文件
//FILE* pf=fopen(“test.txt”, “w”);//把之前的文件内容清空了
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
写一行文件
//fputs(“QWERTYUIOP\n”, pf);
//fputs(“XXXXXXXXXX\n”, pf);
关闭文件
//fclose(pf);
//pf = NULL;
//打开文件
// char* fgets(char* string,int n,FILE* stream);
// strint:数据的存储位置
// n:读取字符的最大个数
// stream:从哪里读
//FILE* pf = fopen(“test.txt”, “r”);
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
//char buff[256] = {0};
读一行文件
fgets(buff, 256, pf);
printf(“%s”, buff);
fgets(buff, 256, pf);
printf(“%s”, buff);
//
//while (fgets(buff, 256, pf) != NULL) {
// printf(“%s”, buff);
//}
关闭文件
//fclose(pf);
//pf = NULL;
//要写入一个结构体或者读入结构体就fprintf或者fscanf
struct S
{
char name[20];
int age;
double dou;
};
//struct S s = { “张三”,20,99.99 };
打开文件
//FILE* pf=fopen(“test2.txt”, “w”);
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
//
写文件
//fprintf(pf, “%s %d %lf”, s.name,s.age, s.dou);//把结构体内的数写道文件里面
//fclose(pf);
//pf = NULL;
//struct S s = {0};
打开文件
//FILE* pf=fopen(“test2.txt”, “r”);
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
读文件
适用于所有输入流
//fscanf(pf, “%s %d %lf”, s.name, &(s.age), &(s.dou));//从pf文件中读取结构体内容
printf(“%s %d %lf”, s.name, s.age, s.dou);//打印出来
//fprintf(stdout,”%s %d %lf”, s.name, s.age, s.dou);//适用于所有输出数据流
//fclose(pf);
//pf = NULL;
如果是二进制的读取或写入使用fread或者fwrite
//struct S s = { “张三”,20,99.9 };
//FILE* pf = fopen(“test3.txt”, “wb”);
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
以二进制写文件
//fwrite(&s, sizeof(struct S), 1, pf); 写结构体s的内容到pf中
//fclose(pf);
//pf = NULL;
struct S s = { “张三”,20,99.9 };
FILE* pf = fopen(“test3.txt”, “rb”);
if (pf == NULL) {
perror(“fopen”);
return 1;
}
//以二进制读文件
fread(&s, sizeof(struct S), 1, pf);
printf(“%s %d %lf \n”, s.name, s.age, s.dou);
fclose(pf);
pf = NULL;
return 0;
}
/*
scanf 格式化的输入函数
printf 格式化的输出函数
fscanf 针对所有输入流的格式化的输入函数
fsprintf 针对所有输出流的格式化的输出函数
sscanf 把一个字符串转换成格式化的数据
ssprintf 把一个格式化的数据转换成字符串
*/
//char buff[256] = { 0 };
//struct S s = { “张三”,20,99.99 };
//struct S tmp = { 0 };
//sprintf(buff, “%s %d %lf”, s.name, s.age, s.dou);//将格式化的数据转化成字符串存放在buff中
//printf(“%s\n”, buff);
从buff字符串中提取结构体数据
//sscanf(buff,”%s %d %lf”, tmp.name, &(tmp.age), &(tmp.dou));
//printf(“%s %d %lf”, s.name, s.age, s.dou);
//使用fwrite或者使用fread进行对文件二进制的输入输出
//size_t fwrite(const void* buffer,size_t size,size_t count,FILE *stream)
// buffer:要写的数据
// size:元素的大小
// count:最多要写几个元素
// stream:从哪写
//struct S s = { “张三”,20,99.9 };
//FILE* pf = fopen(“test3.txt”, “wb”);
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
以二进制写文件
//fwrite(&s, sizeof(struct S), 1, pf);
//fclose(pf);
//pf = NULL;
//size_t fread(const void* buffer,size_t size,size_t count,FILE *stream)
//struct S s = { };
// 读文件 以二进制的方式读
//FILE* pf = fopen(“test3.txt”, “rb”);
//if (pf == NULL) {
// perror(“fopen”);
// return 1;
//}
以二进制读文件
//fread(&s, sizeof(struct S), 1, pf);
//printf(“%s %d %lf \n”, s.name, s.age, s.dou);
//fclose(pf);
//pf = NULL;
//
// return 0;
//}