我们已经完成了一个学生成绩管理系统,有增加学生信息、打印全部学生信息、查找学生、修改信息、删除信息等功能。
但是有一个问题:如果我今天输入了50个学生的信息,结束程序后,我输入的信息全面没有保存,再次运行程序时要重新输入这些信息,太麻烦了。
怎么解决这个问题呢?我们用文件来保存输入的信息。
1 什么是文件
文件是保存在外存储器上的一组数据的有序集合。
文件的特点:
数据长久保存;
数据长度不定;
数据按顺序存取。
2 文件的两种数据形式:文本文件和二进制文件
文本文件中的内容是以ASCII码字符流形式保存,二进制文件是直接把内存数据以二进制形式保存。
例如,整数1234
文本文件保存:49 50 51 52 (4个字符)
二进制文件保存: 04D2 (1234的二进制数)
注:以上内容看不懂就略过,只要知道文件有两种形式就可以了。
我们这里只说文本文件的读写。
3 文本文件的读写四步骤
第1步:定义一个文件指针。
语法格式为:
FILE *文件指针变量名;
如:
FILE * fp ;
目的是通过文件指针fp指向文件缓冲区,通过移动指针实现对文件的操作。
第2步:打开文件。
打开文件语法格式为:
fopen("文件名","文件打开方式")
这里用到了系统函数fopen( )。
函数fopen() 的返回值:
如果执行成功,则返回包含文件缓冲区等信息的FILE型地址,赋给文件指针fp。
如果打开不成功,则返回一个NULL(空值)。
一般要使文件指针与相应文件实体对应起来,就是说,程序对文件指针进行操作。如:
fp = fopen("f.txt", "r") ;
这是指以读(r)的方式打开文件f.txt。
上述文件名前面没有指定文件夹,表示这个文件跟你的程序是在同一个文件夹里的。
如果写成:
fp = fopen("C:\\ABC\\f.txt", "r") ;
表示打开的是电脑C盘里文件夹ABC的文件f.txt,当前你需要在C盘要有这个文件夹ABC。
一般我们会把打开文件写在一个选择语句里,就是说打开不成功时,可以让程序结束。
if((fp = fopen("f.txt", "r")) == NULL)
{
printf("File open error!\n");
exit(0);
}
exit(0):关闭所有打开的文件,并终止程序的执行
参数0表示程序正常结束;非0参数通常表示不正常的程序结束
文件打开方式参数表:
当打开文件时,如果是读文件(以“读”的方式打开),指定的文件必须存在,否则出错;
当打开文件时,如果是写文件(以“写”的方式打开),则指定的文件可以存在,也可以不存在,此时:
以 "w" 方式写文件:
如果该文件已经存在,则原文件将被删去然后重新建立新文件;否则按指定的名字新建一个文件。
以 "a" 方式写文件:
如果该文件已经存在,则写入的数据将被添加到指定文件原有数据的后面,不会删去原来的内容;否则按指定的名字新建一个文件(与“w”相同)。
如果需要将文件同时读和写,那么使用 "r+"、"w+" 或 "a+" 打开文件。
第3步:打开文件以后,进行文件处理,如将文件里的数据读出来,或者将数据写入文件。
等会举例说明。
第4步:关闭文件
语法格式为:
fclose(文件指针名);
把缓冲区中的数据写入磁盘扇区,确保写文件的正常完成。
释放文件缓冲区单元和FILE结构体,使文件指针与具体文件脱钩。
所以函数fclose() 的返回值也有两个:
返回0:正常关闭文件;
返回非0:无法正常关闭文件。
如:
fclose(fp);
只有执行了关闭文件,才能保存数据。
一般我们也会把关闭文件语句写在一个选择语句里,就是说关闭不成功时,可以让程序结束。
如:
if( fclose(fp) )
{
printf( "程序出错,无法关闭文件!\n" );
exit(0);
}
4 总结
今天只讲了文件操作的4个步骤:
1:定义文件指针;
2:打开文件;
3:文件读写;
4:关闭文件(保存数据到文件)。