文件上

知识点2【文件】
1、文件的存取过程

缓冲区的目的:提高存取效率 磁盘使用寿命
2、磁盘文件的分类0-2
物理上 所有的磁盘文件都是 二进制存储,以字节为单位 顺序存储。
逻辑上的文件分类:
文本文件:基于字符编码的文件
二进制文件:基于值编码的文件

总结:(重要)

3、文件指针

注意:不要关系FILE的细节 只需要 会用FILE 定义指针变量就行:FILE *fp=NULL;
(了解)

4、fopen打开一个文件

文件使用方式:
r:以只读的方式打开文件

w:以只写的方式打开文件

a:以追加的方式打开文件(往文件的末尾写入数据)

+:以可读可写的方式打开
b:以二进制的方式打开文件
t:以文本的方式打开文件(省略)
打开方式的组合形式:1-1

关闭文件fclose

知识点3【文件的字节读写】
1、字节的读操作 fgetc函数

void test03()
{
char buf[128]="";
int i=0;
FILE *fp = NULL;
//1、使用fopen打开一个文件 获得文件指针
fp = fopen(“a.txt”, “r”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//2、对文件的操作 fgetc
while(1)
{
	//fgetc调用一次 读取到一个字节
	buf[i] = fgetc(fp);
	if(buf[i] == EOF)//EOF表已经对到文件末尾
	{
		break;
	}
	i++;
}
printf("buf=%s\n", buf);

//3、关闭文件
fclose(fp);

}
运行结果:事先 本地 创建a.txt 文件内容 为 hello file

2、字节的写操作 fputc

void test04()
{
char buf[128]="";
int i=0;
FILE * fp =NULL;
fp = fopen(“b.txt”, “w”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//使用fputc进行文件的数据写入
printf("请输入要写入文件的字符串:");
fgets(buf,sizeof(buf),stdin);//会获取换行符
buf[strlen(buf)-1] = 0;//去掉键盘输入的换行符

//将字符串buf中的元素 逐个写入文件中
while(buf[i] != '\0')
{
	fputc(buf[i], fp);
	i++;
}

fclose(fp);

}

运行结果:

练习:

void test05()
{
//需求:从a.txt读取文件内容 写入到b.txt
FILE *fp1 =NULL;
FILE *fp2 =NULL;

//以只读的方式打开a.txt
fp1 = fopen("a.txt","r");
if(fp1 == NULL)
{
	perror("fopen");
	return;
}

//以只写的方式打开b.txt
fp2 = fopen("b.txt","w");
if(fp2 == NULL)
{
	perror("fopen");
	return;
}


//从fp1中  每读取一个 字节 写入到fp2中
while(1)
{
	char ch;
	//读
	ch = fgetc(fp1);
	if(ch == EOF)//已经读到文件末尾
		break;

	//写
	fputc(ch,fp2);

}
fclose(fp1);
fclose(fp2);
return;

}
运行结果:

知识点4【文件的字符串读写】1-2
1、使用fputs 往文件中写入一个字符串

案例:
void test06()
{
//指针数组
char *buf[]={“窗前明月光\n”,“疑似地上霜\n”,“举头望明月\n”,“低头思故乡”};
int n = sizeof(buf)/sizeof(buf[0]);
FILE *fp = NULL;
int i=0;

fp = fopen("c.txt", "w");
if(fp == NULL)
{
	perror("fopen");
	return;
}

for(i=0;i<n; i++)
{
	fputs(buf[i], fp);
}

fclose(fp);

}
运行结果:

2、使用fgets从文件中获取字符串

返回值:
成功:返回读到字符串的首元素地址
失败:返回NULL

获取文件一行的数据:
void test07()
{
char buf[128]="";
FILE *fp = NULL;
char *path = “c.txt”;
fp = fopen(path, “r”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//err 打开一个文件名叫"path" 而不是path指向的文件名"c.txt"
//fp = fopen("path", "r");
//fp = fopen("c.txt", "r");

while(fgets(buf,sizeof(buf),fp))
{
	printf("%s\n", buf);
}

fclose(fp);

}
运行结果:

知识点5【文件的块读写】fread fwrite
1、使用fwrite 将 数据块 写入到文件中

typedef struct
{
char name[16];//姓名
int deff;//防御
int atk;//攻击
}HERO;

void test08()
{
HERO hero[]={
{“德玛西亚”,80, 60},
{“盲僧”,90, 80},
{“小法”,40, 85},
{“小炮”,50, 90}
};
int n = sizeof(hero)/sizeof(hero[0]);

FILE *fp = NULL;
fp = fopen("hero.txt", "w");
if(fp == NULL)
{
	perror("fopen");
	return;
}

//fwrite 将内存的数据原样的 输出到 文件中
//写入文件的数据 不便于 用户查看 但是 不会影响 程序的读
fwrite(hero, sizeof(HERO), n, fp);

fclose(fp);

}
运行结果:

2、使用fread 从文件中 读取 数据块

案例:
void test09()
{
HERO hero[4];
int i=0;
FILE *fp = NULL;
fp = fopen(“hero.txt”, “r”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

fread(hero,sizeof(HERO), 4, fp);

for(i=0;i<4;i++)
{
	//printf("英雄姓名:《%s》,防御:《%d》,伤害:《%d》\n", \
		hero[i].name,hero[i].deff,hero[i].atk);
	printf("英雄姓名:《%s》,防御:《%d》,伤害:《%d》\n", \
		(hero+i)->name,(hero+i)->deff,(hero+i)->atk);
}


fclose(fp);

}
运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值