文件
文件:存储在外部介质上的数据集合。集合的名称叫文件名。
作用:文件可以保存程序运行结果。
编码分类:ascii文件(文本文件)和二进制文件。
文件操作原理:
1) 文件缓冲区:系统为文件自动的在内存区中为使用的文件开辟的缓冲区。
2) 输入输出流:数据的输入输出。
1 文件操作步骤:
1) 引入头文件 stdio.h
2) 定义文件指针
3) 打开文件
4) 文件读写
5) 关闭文件
2 文件相关函数
字符读写函数:fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:fread 和fwrite
格式化读写函数:fscanf和fprintf
3 文件指针
FILE *指针变量标识符;
文件指针指向文件在内存的首地址。
1) 文件打开(fopen)
打开文件是建立文件的各种信息,并使文件指针指向该文件,以便进行其他操作。
FILE *fp=NULL; //定义文件指针并赋值为NULL
fp=fopen(文件名,文件使用方式);
成功返回文件首地址,否则为NULL。
2) 文件关闭(fclose)
断开指针与文件的联系。
fclose(fp);
4文件使用方式
r 只读
w 只写 创建或者先删后建文件。
a 只写 文件存在追加,不存在创建。换行追加
r+ 读写
w+读写 创建文件或者覆盖文件
a+ 读写 等价a但是可以读。 t 打开文件文件 默认打开文本文件。
b 打开二进制文件
注意
凡是以 r 打开的文件,文件必须存在。
打开文件失败是 返回NULL。
文本文件读入内存时需要将ascii转换为二进制。写入时相反。对二进制读写不需要转换。
5 文件函数使用
1) 字符读写函数
单位:字节
fputc(字符,文件指针);//把字符写入文件。
使用循环写入字符串。
- 读取一个字符
- fgetc(fp);
-
- char s=fgetc(fp);
- while(s!=EOF){ //EOF 文件结束标志
- s=fgetc(fp); //文件指针会自动向后移动
- putchar(s);
- }
复制代码
rewind(fp)将文件指针重新指向文件首地址。
2) 字符串读写
fputs(字符串,文件指针);
返回值为写入的字节数。
char str[100];
fgets(数组名称;sizeof(str),fp); //一次读取数组的长度个字节
1)文件读取完成后会给字符串数组加 \0 。
2)遇到\n或者EOF读取结束。 每次读取一行。
一个汉字 3个字节
一个字符1个字节
3) 数据块读写函数
fwrite(写入数据的首地址,块大小,块数,文件指针);
fread(数组首地址,块大小,块数,文件指针);
文件与结构体
写结构体
- struct Student{
- char name[20];
- int age;
- }stu[10];
- fwrite(结构体变量地址,结构体大小,1,fp);
-
- for(int i=0;i<10;i++){
- fwrite(&stu[i],sizeof(struct Student),1,fp);
-
- }
复制代码
读结构体
- struct Stuent stu2[10];
-
- for(int i=0;i<10;i++){
-
- fread(&stu2[i],sizeof(struct Student),1,fp);
-
- }
复制代码
4) 格式化读写函数
fscanf(文件指针,格式字符串,输入列表);
fscanf(fp,“%d%d”,&i,&j);
fprintf(文件指针,格式字符串,输入列表);
fprintf(fp,“%d%d”,i,j);
5)文件随机读写函数
fseek 移动文件内部的位置指针
fseek(文件指针,位移量,起始点);
位移量:移动的字节 long型数据数字后加L
起始点:从哪开始移动
文件首部 SEEK_SET 0
文件当前位置SEEK_CUR 1
文件末尾 SEEK_END 2
6)文件检测函数
feof(文件指针)
判断指针是否指向文件结束位置。 返回值 :结束是1 没结束为0。
ferror 文件出错检测函数。
文件操作实例
简易通讯录 代码见附件
|
|