c语言-文件
1.1 数据流
数据的输人与输出都必须通过计算机的外围设备,不同的外围设备对于数据输人与输出的概式和方法有不同的处理方式,这就增加了编写文件访问程序的困难程度,而且很容易产生外围设备彼此不兼容的问题。数据流( Data Stream)用来解决这个问题。数据流的性质比数据的各种输人和输出更单一。它将整个文件内的数据看作- - 串连续的字符(字节),面没有记录的限制,如图所示。数据流借助文件指针的移动来访问数据,文件指针 目前所指的位置即是要处理的数据,经过访问后文件指针会自动向后移动。每个数据文件后面都有一个文件结束符号( EOF),用来 文件指针告知该数据文件到此结束,若文件指针指到EOF便表示数据已访问完毕。
1.2 文件指针
要调用一个文件,一般需要该文件的一些信息,缓存文件系统会为每一个文件系统开辟下面这样一个“文件信息区”,包含在头文件stdio.h中,它被定义为FILE类型数据。
typedef struct
{
short level; /*缓冲区“满”或“空”的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读取字符*/
short basize; /*缓冲区大小*/
unsigned char *curp; /* 数据缓冲区的读写位置*/
unsigned istemp; /*临时文件,指示器*/
short token; /*用于有效性检查*/
}FILE;
在编写源程序使用一个数据文件时,只需要先预包含stdio.h头文件,然后定义一个指向该结构体类型的指针。
如:
FILE *fp
1.3 打开文件
fopen函数原型:
FILE *fopen(char *filename,char *mode);
功能:使用 mode 模式打开指定的 filename 文件,如果打开成功,
则返回一个FILE类型的指针,如果打开失败,则返回NULL。(可依此判断是否打开成功)
使用:第一个参数只写文件名即可,第二个参数用来设定要打开的文件类型和指定文件的访问模式,必须是字符串格式;每个参数必须用双引号“ ”括起来。
文件使用方式由r,w,a,t,b,+六个字符拼成,意义如下:
r:(read)读;
w:(write)写;
a:(append)追加;
t:(text)文本文件(可省略);
b:(binary)二进制文件;
+:读和写;
》》用“r”打开的文件必须已存在;
》》用“w”打开的文件,若存在则将其删去重建一个,若不存在则建立一个
访问模式参见表:
文件使用方式 | 意义 |
---|---|
“rt” | 只读打开一个文本文件,只允许读数据 |
“wt” | 只写打开或建立一个文本文件,只允许写数据 |
“at” | 追加打开一个文本文件,并在文件末尾写数据 |
“rb” | 只读打开一个二进制文件,只允许读数据 |
“wb” | 只写打开或建立一个二进制文件,只允许写数据 |
“ab” | 追加打开一个二进制文件,并在文件末尾写数据 |
“rt+” | 读写打开一个文本文件,运行读和写 |
“wt+” | 读写打开或建立一个文本文件,允许读和写 |
“at+” | 读写打开一个文本文件,允许读,或在文件末追加数据 |
“wb+” | 读写打开或建立一个二进制文件,允许读和写 |
“ab+” | 读写打开一个二进制文件,允许读,或在文件末追加数据 |
(1)
FILE *fp;
fp=fopen("D:\\bibibi.txt","rt");
(2)
FILE *fp;
fp=fopen("D:/bibibi.txt","rt");
第一种方法用“\\”第一个反斜线表示转义字符,第二个反斜线表示根目录,用第二种方法的“/”也可以实现。
打开文件也可由键盘输入文件名及路径:
FILE *fp;
char name[50];
gets(name);
fp=fopen(name,"rt");
1.4 关闭文件
fclose函数原型:
int fclose(FILE *fp)
功能:将文件指针fp所指的文件关闭。若关闭成功则返回0,若失败则返回非0值。
fclose(fp);
若采用读取模式打开,可以不做关闭操作。若采用写入模式,一等要使用此函数关闭,否则会出现数据遗失的情况。
1.5 获取文件属性
fileno函数(所在头文件:stdlib.h)原型:
int fileno(FILE *fp);
功能:返回所打开文件指针所对应的描述字。当打开文件成功后,操作系统会自动赋予一个号码,以此来代表所打开的文件。
filelength函数(所在头文件:io.h)原型:
long filelength(int handle_no);
功能:返回文件描述字对应的文件大小,以自己为大小。
例:
FILE *fp;
int fno,size;
fp=fopen("D:\\bibibi.txt","rt");
fno=fileno(fp);
size=filelength(fno);
fclose(fp);
1.6 文件顺序读写
1>单字符读写函数
-读 ****** fgetc()函数原型:
int fgetc(FILE *fp);
功能:读取文件指针fp目前所指文件位置中的字符,读取完毕,文件指针自动下移一个字符位置,若文件已到达文件尾部,返回-1。
fgetc(fp);
-写******fputc()函数原型:
fputc(char ch,FILE *fp);
功能:把字符ch写入文件指针fp所指的文件的位置,若成功则返回字符的ASCII码,若失败则返回EOF;
FILE *fp;
fputc('c',fp);
2> 字符串读写函数
-读******fgets()函数原型:
char *fgets(char *str,int n, FILE *fp)
功能:在文件指针fp所指文件位置读取n个字符并放入str字符数组在,若读不到则返回NULL。
FILE *fp;
char str[20];
fp=fopen("D:\\bibibi.txt","rt")
fgets(str,10,fp);
-写******fputs()函数原型:
int fputs(char *str,FILE *fp);
功能:将字符串str写入文件指针fp所指文件的位置。若写入成功,则返回非0值,失败则返回EOF。
FILE *fp;
char str[20];
fp=fopen("D:\\bibibi.txt","rt");
gets(str);
fputs(str,fp);
3>格式化字符串读写函数
-读******fscanf()函数原型:
int fscanf(FILE *fp,“格式化字符串”,地址);
功能:从文件指针fp所指向的文件中按照格式字符率指定的格式将文件中的数据送到输人项地址表中。若读取数据成功会返回所读取数据的个数,并将数据按照指定格式存人内存中的变量或数组中,文件指针自动向下移动;若读取失败则返回EOF。
char a[10],b[10],c[10];
FILE *fp;
fp=fopen("D:\\bibibi.txt","rt");
fscanf(fp,"%s %s %s",a,b,c);
-写******fprintf()函数原型
int fprintf(FILE *fp,“格式化字符串”,地址);
功能:将输出项表中的变量值按照格式字符串指定的格式输出到文件指针fp所指的文件位置。
char a[10],b[10],c[10];
FILE *fp;
fp=fopen("D:\\bibibi.txt","rt");
fprintf(fp,"%s %s %s",a,b,c);
4>数据块读写操作
-读******fread()函数原型:
int fread(void *buffer,int size,int count,FILE *fp);
功能:从文件指针fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读取到的数据存到buffer开始的内存区中,同时将读写位置指针后移size*count次。
float a[10];
fread(a,2,10,fp);
-写******fwrite()函数原型:
int fwrite(void *buffer,int size,int count,FILE *fp);
功能:从buffer所指向的内存区开始,一次输出size个字节,重复count次,并将输出的数据存入fp所指向的文件中,同时将读写位置指针后移size*count次。
float a[10];
fwrite(a,2,10,fp);
例如:
struct student
{
char name[20];
int number;
};
struct student stud[50];
......
for(i=0;i<40;i++) fwrite(&stu[i],sizeof(struct student),1,fp);