前面三部分已经给大家介绍过了,网址发给大家方便大家复习
打开方式如下:
文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 建立一个新的文件
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件
实例代码:
/* fopen fclose example */ #include <stdio.h> int main () { FILE * pFile; //打开文件 pFile = fopen ("myfile.txt","w"); //文件操作 if (pFile!=NULL) { fputs ("fopen example",pFile); //关闭文件 fclose (pFile); } return 0; }
4. 文件的顺序读写
4.1 顺序读写函数介绍
功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "w");//定义一个变量pf,pf指向这个文件信息区,文件信息区和文件本身相关联,这时候我们就可以读或者写或者对文件做一些其他的事情等等 if (pf == NULL) { printf("%s\n", strerror(errno)); return 1; } //写文件 //...... //关闭文件 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
这里有同学可能会问,为什么要关闭pf所指向的这个文件呢?
这是因为文件也是资源,最后你把文件关闭掉也就是将资源释放掉了,一个程序能打开的文件个数是有数的,并不是说可以无限打开,我打开之后关闭了以便我后期打开更多的文件,而且如果你不关闭这个文件可能会造成数据的丢失等等,所以一定要关闭文件并且置为NULL
fputc函数
大家来看代码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 1; } char i = 0; for (i = 'a'; i <= 'z'; i++) { fputc(i, pf); } //写文件 //...... //关闭文件 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
大家可以将代码拷贝一份去自己测试一下
这个时候我们再打开test.txt文件来看一看我们刚才的26个字母是否都已经写到文件里面了
大家看,结果属实
现在我们要以字符的形式将我的我的文件里的字符都拿出来,这个时候就要用到fgetc函数
fgetc函数
简言之,如果读到一个错的字符就返回EOF
现在我们来看代码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 1; } int ch = 0; while ((ch = fgetc(pf)) != EOF) { printf("%c ", ch); } //char i = 0; //for (i = 'a'; i <= 'z'; i++) //{ // fputc(i, pf); //} //写文件 //...... //关闭文件 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
大家看fgetc就把文件里面的所有字符都读取出来了
现在呢我们写一行数据,这个时候就要用到fputs函数
fputs函数
const char * str, FILE * stream
Write string to stream这里的意思是将字符串写到流(也就是文件)里面去
大家看,大家可能就有疑问了,我们刚才不是写了26个英文字母吗,为什么这里的26个字母不见了呢?这是因为你再次向文件里面写数据的时候,会自动将你原来文件里面写的东西全部清空然后重新写,希望大家能够理解
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "w");//"w"改成"a"的时候是追加的意思。我们来看下面的图片 if (pf == NULL) { printf("%s\n", strerror(errno)); return 1; } fputs("hello bit", pf); //int ch = 0; //while ((ch = fgetc(pf)) != EOF) //{ // printf("%c ", ch); //} //char i = 0; //for (i = 'a'; i <= 'z'; i++) //{ // fputc(i, pf); //} //写文件 //...... //关闭文件 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
FILE pf = fopen(“test.txt”, “w”);//"w"改成"a"的时候是追加的意思。我们来看下面的图片*
现在我们要随机读一行数据应该怎么办呢,所以我们引入fgets函数
fgets函数
读到的字符串将会拷贝到str指向的空间的位置
最多的字符的个数将会被拷贝到str里面
大家可以尝试着自己理解一下
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 1; } char arr[20]; fgets(arr, 5, pf); printf("%s\n", arr);//放5的时候最多能够读到4个 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
这里给大家介绍一下perror这个函数,用起来更方便一些
perror函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test", "r"); if (pf == NULL) { //printf("%s\n", strerror(errno)); perror("fopen"); return 1; } char arr[20]; fgets(arr, 5, pf); printf("%s\n", arr);//放5的时候最多能够读到4个 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
/这里给大家介绍一下fprintf函数
fprintf函数
将代码给大家
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> struct S { char arr[20]; int age; float score; }; int main() { struct S s = { "zhangsan",25,50.5f }; FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { //printf("%s\n", strerror(errno)); perror("fopen"); return 1; } fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//fprintf将数据写到文件里面去 fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
如果想要把数据从文件中读出来,这里就必须引入fscanf函数
fscanf函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> struct S { char arr[20]; int age; float score; }; int main() { struct S s = { "zhangsan",25,50.5f }; FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { //printf("%s\n", strerror(errno)); perror("fopen"); return 1; } fscanf(pf, "%s %d %f", s.arr, (&s.age), &(s.score));//fscanf从文件里面去读,将信息从pf指向的文件读出来放到s里面去,再将其打印出来 printf("%s %d %f", s.arr, s.age, s.score); fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
fwrite函数的介绍
fwrite函数
这个时候你发现你有一些东西是看不懂的,这是因为这是以二进制的形式写进去的
我们以二进制的形式写进去那么就可以以二进制的形式读出来,这时候就要引入fread函数
fread函数
我们以二进制的形式写进去,我们就可以已二进制的形式读出来
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#include<stdlib.h> #include<errno.h> #include<string.h> struct S { char arr[20]; int age; float score; }; int main() { struct S s = { "zhangsan",25,50.5f }; FILE* pf = fopen("test.txt", "wb"); if (pf == NULL) { perror("fopen"); return 1; } //fwrite(&s, sizeof(struct S), 1, pf); fread(&s, sizeof(struct S), 1, pf); printf("%s %d %f\n", s.arr, s.age, s.score); fclose(pf); pf = NULL;//设置成空指针使其再也找不到这块空间 return 0; }
本章终!