什么是文件呢?文件就是保存在外存里的数据的集合。本篇文章介绍一种在外存保存数据的手段。
1:二进制文件与文本文件
先来看一个约定
整数65的终端形式是"65"(即’6’和’5’),而整数65的字符形式是’A’,把整数65称为终端形式的原形式。终端是指键盘、显示器等和用户直接打交道的输入输出设备。
二进制文件和文本文件的区别
二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。
文本文件是把数据终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。
二进制文件与文本文件的取舍
(1)如果要存储字符数据,无论是放在文本文件中还是放在二进制文件中都和内存中的数据形式没有区别,因为字符数据的原形式和终端形式是一样的。在存储和输入输出的特性上也没有任何区别,不浪费存储空间也不浪费转换时间。所以,如果一个文件只存放字符数据,那么讨论该文件是用文本文件还是二进制文件是没有任何意义的。
(2)如果要存储非字符数据,则情况要复杂一些。
1:如果需要频繁地保存和访问数据,那么应该采用二进制文件进行存放,这样可以节省存储空间和转换时间。
2:如果需要频繁地向终端显示数据或从终端读入数据,那么应该采用文本文件进行存放,这样可以节省转换时间。
2:文件的打开与关闭
何为缓冲文件系统
ANSI C对文件的处理方法叫作“缓冲文件系统”。所谓缓冲文件系统是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘。对文件读写之前要“打开”该文件(实为与缓冲区取得联系),在使用结束之后应“关闭”该文件(实为与缓冲区切断联系)。可见程序员只和缓冲区打交道而从来不和内存直接打交道。
文件打开函数
文件打开函数(fopen函数)
函数原型:
FILE * fopen(char * filename,char * mode);
参数:
filename指定文件名称,mode指定打开文件的方式
例子:
FILE * fp;
fp=foprn("a1","r");
表示要打开名字为a1的文件,使用文件方式为“读入”。fopen函数返回指向a1文件的指针并赋给fp,这样fp就和文件a1相联系了,或者说fp指向a1文件。
文件使用方式及含义
文件使用方式 含义
“r” (只读) 为输入打开一个文本文件
“w” (只写) 为输入打开一个文本文件
“a” (追加) 向文本文件尾添加数据
“rb” (只读) 为输入打开一个二进制文件
“wb” (只写) 为输出打开一个二进制文件
“ab” (追加) 向二进制文件尾添加数据
“r+” (读写) 为读写打开一个文本文件
“w+” (读写) 为读写建立一个新的文本文件
“a+” (读写) 为读写打开一个文本文件
“rb+” (读写) 为读写打开一个二进制文件
“wb+”(读写) 为读写建立一个新的二进制文件
“ab+”(读写) 为读写打开一个二进制文件
系统自定义了三个文件指针stdin、stdout、和stderr,分别指向终端输入、终端输出和标准出错输入(也从终端输出)。
文件关闭函数
文件关闭函数(fclose函数)
函数原型:fclose(文件指针);
例子:
fclose(fp);
前面我们将打开文件(用fclose函数)时所带回的指针赋给了fp,通过fp把该文件关闭,即fp不再指向该文件。应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将丢失数据。
3:文件的读写
文本文件输入输出函数
fscanf函数和fprintf函数用于文本文件相关的格式化输入和输出。
函数原型:
fscanf(文件指针,格式字符串,输入表列);
fprintf(文件指针,格式字符串,输出表列);
下面放一个例子:
从键盘接收两个学生的信息(学号、姓名、年龄),并保存到文本文件student.dat中。
#include<stdio.h>
void main()
{
FILE * out;
int i;
struct student
{
int code;
char name[10];
int age;
}a[2];
if((out=fopen("student.dat","w+"))==NULL)
{
printf("Cannot open output file.");
}
for(i=0;i<2;i++