程序文件:源程序文件(.c),目标文件(.obj),可执行文件(.exe),这种程序文件的内容是代码。
数据文件:供程序运行时读写的数据。(主要讲数据文件)
所谓的“文件”是存储在外部介质上的数据的集合,操作系统是以文件为单位对数据进行管理的。
要向外部介质上存储数据也必须建立一个文件(以文件名作为标志),才能向它输出数据。
一个文件的唯一标识。包括(1)文件路径 (2)文件名主干(标识符命名规则一样)(3)文件后缀
从操作系统看,每一个与主机相连的输入输出设备看做是一个文件:
例:输入文件:终端键盘 输出文件:显示屏和打印机
按数据的组织形式:
ASCII文件(文本文件)
二进制文件(映像文件)
例如:整数10000
系统自动的在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区
从内存向磁盘输出的数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。
每个文件只有一个缓冲区。输出时作为输出缓冲区,输入时作为输入缓冲区
缓冲文件系统中,每个被使用的文件都会开辟一个文件信息区(包括文件的名字,状态当前位置等等),这些信息保存在一个结构体变量中,通过文件的指针变量能够找到与它关联的文件。
该结构体是由系统声明的,取名为FILE,C编译环境
FILE * fp; //定义一个指向文件型数据的指针变量
//指向文件的指针变量并不是指向外部介质上的数据文件的开头,而是指向内存中的文件信息区的开头。
对文件读写之前应该先打开“文件”(建立文件信息区和缓冲区),在使用结束后应该关闭“文件”。
//格式:fopen(文件名,使用文件的方式);
FILE * fp; //定义一个指向文件的指针变量
fp = fopen("al","r"); //将fopen函数的返回值赋给指针变量fp,这样fp和a1文件有联系了,fp指向了a1文件
打开一个文件,需要三个信息:①文件名字;②使用文件的方式;③需要指向文件的指针变量;
以上以计算机为角度,向文件读取,写入
注:二进制无换行,文本文件有换行(ASCII值)
//格式:fclose(文件指针);
fclose(fp); //使文件指针变量不再指向该文件,有返回值,如果返回值为0,成功关闭,返回值为EOF(-1),关闭失败
顺序写入时,先写入的数据存放在文件中前面的位置,后写入的数据存放在文件中后面的位置。
顺序读时,先读文件中前面的数据,后读文件中后面的数据。
对文本文件读入或输出一个字符
//格式:fprintf(文件指针,格式字符串,输出列表);
//格式:fscanf(文件指针,格式字符串,输入列表);
fprintf(fp,"%d",32);//输出32到文件磁盘上
和 printf() 和 scanf() 的区别是:读写的对象不同
printf() 和 scanf() 读写的对象是终端
fprintf() 和 fscanf() 读写的对象是文件
//格式:fread(buffer,size,count,fp);
//格式:fwrite(buffer,size,count,fp);
//buffer:地址,
//对于fread来说,它是用来存放文件读入的数据的存储区的地址
//对于fwrite来说,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)
//size:要读写的字节数
//count:要读写多少个数据项
//fp:FILE类型指针
不是按照数据在文件中的物理位置次序进行读写的,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问的方法效率高的多。
(1)位置标记
(2)位置标记的定位
rewind() 函数使文件位置标记指向文件头,此函数没有返回值
rewind(fp1); //使文件位置标记返回文件开头
fseek() 函数改变文件位置标记
格式:fseek(文件类型指针,位移量,起始点);
fseek(fp,100L,0);//将文件位置标记从文件开头前移100个字节处
fseek(fp,50L,1);//将文件位置标记向前移到离当前位置50字节处
fseek(fp,-50L,2);//将文件位置标记从文件末尾后退50个字节处