第三部分文件操作部分
一. c语言文件指针
- 定义
-
指向一个文件的指针变量
FILE *指针变量名; FILE *fp = NULL; 注意:FILE是一个结构体
-
- 文件的打开和关闭
-
文件的打开
建立文件的关联关系,用文件指针指向某个具体的文件,文件打开需要使用 fopen fopen("文件名","打开方式"); 注意:fopen有返回值, 如果打开文件成功,返回文件的首地址 如果打开文件失败,返回的是NULL 完整的打开文件的语句: FILE *fp = NULL; fp = fopen("a.txt","r"); //r 只读 简化: FILE *fp = fopen("a.txt","r");
-
文件的关闭
fclose(文件的指针); fclose(fp);
-
- 字符读写函数:fgetc和fputc
- fputc 函数的作用 向指定文件中写入一个字符 ,fputc(字符常量或者是字符变量,文件指针);fputc函数有返回值,返回的时写入的字符
- fgetc 函数的作用 从指定的文件中读取一个字符,fgetc每次从文件中读取一个字符
- 数据块读写函数fread和write
-
fwrite 和 fread 是数据的写入和读取的函数,每次读写一块数据,不是读取字符个数 fwrite(buffer,size,count,fp);fread(buffer,size,count,fp);
//定义文件指针 FILE *fp = fopen("fwriteString.txt","w"); //判断文件是否打开成功 if(fp!=NULL){ // fwrite(buffer,size,count,fp); char str[]="helloWorld!"; //使用fwrite 写入一块数据 fwrite(str,strlen(str),1,fp); printf("文件写入成功!\n"); }
-
从文件中读取结构体信息 fwrite(&stu[i],sizeof(struct Studnet),1,fp)
-
#include<stdio.h>
int main()
{
struct student{
char name[20];
char sex;
int age;
float score;
};
struct student stu[5]={{"zbz",'F',38,59.99f},{"sb",'F',48,59.99f},{"cgx",'F',18,59.99f},{"dlj",'M',8,59.99f},{"banzhang",'Y',18,99.99f}};
//写入数据
FILE *fp = fopen("student.data","wb+");
if(fp!= NULL){
for(int i = 0 ; i < 5 ; i++){
fwrite(&stu[i],sizeof(struct student ),1,fp);
}
printf("文件写入成功!\n\n\n");
// 文件指针拉回来
rewind(fp);
struct student stuArray[5];
printf("姓名\t\t性别\t\t年龄\t\t成绩\n");
for(int i = 0 ; i < 5 ; i++){
fread(&stuArray[i],sizeof(struct student),1,fp);
printf("%s\t\t%c\t\t%d\t\t%.2f\n",stuArray[i].name,stuArray[i].sex,stuArray[i].age,stuArray[i].score);
}
}
return 0;
}
3. 格式化读写函数fscanf和fprintf
1. fscanf() 格式化的读取,从文件中读取
2. fprintf() 格式化的写入,写入到文件中
fscanf(fp,"%d:%f,%s\n%s",&productId,&productPrice,productTitle,productTitleImg);
fprintf(fp,"%d:%.2f,%s\n%s",productId,productPrice,productTitle,productTitleImg);
二实现通讯录操作--代码实现
#include<stdio.h>
#include<string.h>
//定义宏,联系人数组的长度,姓名长度,电话号码的长度
#define NAME_LEN 22
#define TELNUM_LEN 16
#define LEN 100
typedef struct{
char name[NAME_LEN];
char telNum[TELNUM_LEN];
} Person; //给结构体起一个别名
//定义联系人数组,保存联系人个数,文件的名称
Person contacts[LEN];
int totalContactCount=0;
char *filePath="telbook.data";
//定义函数,并且声明
void doAdd();
void doDelete();
void doUpdate();
void doList();
void doSearchByName();
void init();
void writeToFile();
int main()
{
init();
int flag = 1;//退出的标志
int num=0;
while(flag){
//编写控制程序
printf("\n\n**************************\n");
printf("****** 欢迎使用通讯录 ******\n");
printf("****** 1、添加联系人 ******\n");
printf("****** 2、删除联系人 ******\n");
printf("****** 3、修改联系人 ******\n");
printf("****** 4、查看所有联系人 ****\n");
printf("****** 5、搜索联系人 ******\n");
printf("****** 6、退出系统 ******\n");
printf("**************************\n\n");
printf("请输入1-6之间的序号,选择要执行的功能\n");
//接收用户输入的编号
scanf("%d",&num);
if(num<1||num>6){
printf("输入错误!\n");
}else{
//根据不同的编号,执行不同的功能
switch(num){
case 1:
doAdd();
break;
case 2:
doDelete();
break;
case 3:
doUpdate();
break;
case 4:
doList();
break;
case 5:
doSearchByName();
break;
case 6:
printf("正在退出系统...\n");
printf("系统已经退出!\n");
//return 0;
flag = 0;
break;
default:
break;
}
}
}
return 0;
}
/**
* 添加联系人
1) 提示用户输入联系人信息
2)接收联系人信息
3)提示输入电话号码信息
4)接收电话号码
5)让用户再次确认添加联系人 1 确认 0 取消
6)保存联系人信息到 联系人数组中
7)让联系人的个数+1
8) 把最新的数组,重新保存到文件中
*/
void doAdd(){
printf("您正在执行的是添加联系人的操作:\n");
//1. 提示用户输入联系人信息
printf("请输入联系人姓名: [*联系人姓名中间不能又空格]\n");
//2. 接受联系人信息
char name[NAME_LEN];
char telNum[TELNUM_LEN];
scanf("%s",name);
//3.提示输入电话号码信息
printf("请输入联系人电话号码: [*联系人号码中间不能有空格]\n");
//4)接收电话号码
scanf("%s",telNum);
//5.让用户再确认
int queren = 0;
printf("修改后联系人信息后,数据无法恢复,请确认修改:0.取消 1.确认\n");
scanf("%d",&queren);
if(queren){
strcpy(contacts[totalContactCount].name, name);
strcpy(contacts[totalContactCount].telNum, telNum);
// strcpy(contacts[totalContactCount].name,name);
//strcpy(contacts[totalContactCount].telNum,telNum);
totalContactCount++;
writeToFile();
}
printf("添加联系人成功!\n");
}
/**
* 删除联系人
1)提示用户输入一个要删除的联系人的编号
2)判断编号是否合法
3)再判断 要删除的元素 是否是数组的最后一个元素
如果是最后一个元素,总人数-1
如果不是最后一个元素,也就是中间的元素
移动元素
i = 编号 i< 总 i++
a[编号-1] = a[编号]
总人数-1
4)同步写入到文件中
*/
void doDelete(){
printf("您正在执行的是删除联系人的操作:\n");
doList();
// 1 . 提示用户输入uige要删除的联系人的编号
int nn;
printf("请输入一个要删除的联系人的编号:\n");
scanf("%d",&nn);
if(nn<1||nn>totalContactCount){
return;
}
int queren = 0;
printf("联系人删除后,无法恢复,请确认是否要删除:0 取消 1 确认");
scanf("%d",&queren);
if(queren){
if(nn==totalContactCount){
totalContactCount--;
}else{
for(int i = nn; i <totalContactCount;i++){
contacts[i-1]=contacts[i];
}
totalContactCount--;
}
writeToFile();
}
}
/**
* 修改联系人
1) 提示用户输入一个联系人的编号
2) 判断编号是否合法
3)让用户输入新的联系人姓名和电话
4) 接收用户的输入
5)让用户再次确认删除
6)把原来的姓名和电话进行更新
7)同步保存到文件中
*/
void doUpdate(){
printf("您正在执行的是修改联系人操作:\n");
doList();
int nn;
printf("请输入一个要修改联系人的编号:\n");
scanf("%d",&nn);
if(nn<1||nn>totalContactCount){
return;
}
char name[NAME_LEN];
char telNum[TELNUM_LEN];
printf("请输入联系人的姓名: 【*联系人姓名中间不能有空格】");
scanf("%s",name);
printf("请输入联系人的电话: 【*联系人电话中间不能有空格】");
scanf("%s",telNum);
int queren = 0;
printf("修改后的联系人信息后,数据无法恢复,请确认修改: 0 取消 1 确认");
scanf("%d",&queren);
if(queren){
strcpy(contacts[nn-1].name,name);
strcpy(contacts[nn-1].telNum,telNum);
writeToFile();
}
}
/**
* 查询所有的联系人
思路:
1)先判断 totalContactCount == 0
如果等于0 表示没有联系人,提示:通讯录空无一人
不等于0 打印所有的联系人
2)循环
3)遍历输出所有的联系人信息
*/
void doList(){
printf("您正在执行的是查询所有的联系人的操作:\n");
if(totalContactCount==0){
printf("您的通信录还很寂寞!\n");
}else{
printf("编号\t\t姓名\t\t电话\t\t\n");
for(int i = 0 ; i<totalContactCount;i++){
printf("%d\t\t%s\t\t%s\t\t\n",i+1,contacts[i].name,contacts[i].telNum);
}
}
}
/**
* 搜索联系人
1) 提示用户输入一个联系人的姓名
2)接收这个姓名
3)循环,遍历数组
//进行字符串的比较
//strcmp(contacts[i].name,name) == 0
//如果查找到了,输出这个联系人的电话号码
//如果没有查找到,提示:没有查找到
*/
void doSearchByName(){
printf("您正在执行的是搜索联系人的操作:\n");
char name[NAME_LEN];
printf("请输入联系人的姓名: 【*联系人的姓名中间不能有空格\n】");
scanf("%s",name);
int i ;
for( i = 0 ; i < totalContactCount;i++){
if(strcmp(contacts[i].name,name)==0){
printf("您要查的联系人:%s的电话是:%s\n",name,contacts[i].telNum);
break;
}
}
if(i==totalContactCount){
printf("对不起没有查到%s这个人!",name);
}
}
/**
* 初始化函数
思路:
1)定义文件指针,并且(尝试)打开文件
2)如果能够打开这个文件(说明文件已经存在了)
i.把文件中存放联系人数量读取出来
ii.根据联系人的数量,把联系人信息全部读取出来,放到联系人数组中
如果文件打开失败了
i.创建文件
ii.写入联系人数量 0
3)关闭文件指针
*/
void init(){
printf("系统正在初始化.......\n");
FILE *fp = fopen(filePath,"r");
if(fp!=NULL){
fread(&totalContactCount,sizeof(totalContactCount),1,fp);
for(int i = 0 ; i < totalContactCount;i++){
fread(&contacts[i],sizeof(Person),1,fp);
}
}else{
fp = fopen(filePath,"w");
fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);
printf("通讯录文件创建成功!\n");
}
fclose(fp);
fp=NULL;
printf("系统初始化完成!\n");
}
/**
* 把数组的内容重新写入到文件中
1)打开文件,w
2)判断是否打开成功
3)先把联系人的数量写入到文件中
4)把每个联系人的数据,都写入到文件中
5)关闭文件
*/
void writeToFile(){
FILE *fp = fopen(filePath,"w");
if(fp!=NULL){
fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);
for(int i = 0 ; i < totalContactCount;i++){
fwrite(&contacts[i],sizeof(Person),1,fp);
}
printf("数据更新完毕!\n");
}
fclose(fp);
}
网友评论