📄 data_operate.cpp
字号:
#include "stdafx.h"
#include "Data_Operate.h"
#include "DataDefine.h"
#include "OtherFunc.h"
#include <string.h>
#include <conio.h>
///////////////////////////////////////////////////////////////////////
//
// 函数名 : GetDataPoint
// 功能描述 : 加载文件并填充data结构
// 参数 : BookData data[MAXSIZE]
// 返回值 : bool 表示出是否成功
//
///////////////////////////////////////////////////////////////////////
bool GetDataPoint(BookData data[MAXSIZE])
{
FILE *fp;
if((fp=fopen("data","rb"))==NULL)//只读加载
{
return false;//失败
}
int i;
for(i=0;i<MAXSIZE;i++)//填充各个数据数组
{
fseek(fp,i*sizeof(BookData),0);//数组号*bookdata结构字长=新的元素所在偏移
if(!fread(&data[i],sizeof(BookData),1,fp))//每次读入数据长度为bookdata结构字长
{
fclose(fp);//关闭
return false;
}
}
return true;
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : InsertData
// 功能描述 : 插入数据
// 返回值 : bool 当没有存储空间时失败
//
///////////////////////////////////////////////////////////////////////
bool InsertData()
{
FILE *fp;
BookData data[MAXSIZE];
FreeData(data);//free for safe
GetDataPoint(data);
unsigned int uFree=MAXSIZE+1; //初使总是大于最大储存,做为一个辨别数据是否已满条件
for(int i=0;i<MAXSIZE;i++)
{
if(!data[i].uBokno)//找空余的数组元素,当书号为0时认为是一个空元素
{
uFree=i;
break;
}
}
if(uFree>MAXSIZE)//uFree=MaxSize+1>MaxSize说明没有空元素了
{
gotoxy(0,18);//定位显示
printf("没有存储空间了,请先删除!\nPress any key to continue...");
getche();
return false;
}
//书号 书名 作者 出版社 单价
//12345678901234567890123456789012345678901234567890
//0 1 2 3 4
gotoxy(0,18);
printf("输入书号:");
scanf("%d",&data[uFree].uBokno);
getchar();
printf("输入书名:");
scanf("%s",&data[uFree].szBookName);
getchar();
printf("输入作者:");
scanf("%s",&data[uFree].szAuthor);
getchar();
printf("输入出版社:");
scanf("%s",&data[uFree].szPublic);
getchar();
printf("输入单价:");
scanf("%f",&data[uFree].uPrize);
getchar();
printf("输入数量:");
scanf("%d",&data[uFree].uQuantity);
getchar();
fp=fopen("data","w+");//改写模式
fwrite(data,MAXSIZE*sizeof(BookData),1,fp);//写的长度为全部data元素
fclose(fp);
return true;
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : DeleteData
// 功能描述 : 删除数据
// 参数 : BookData data[MAXSIZE]
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
void DeleteData(BookData data[MAXSIZE])
{
FILE *fp;
unsigned int iBuf;
gotoxy(0,18);
printf("请输入你要删除的书号:");
scanf("%d",&iBuf);
getchar();
for(int i=0;i<MAXSIZE;i++)
{
if(data[i].uBokno==iBuf)//找匹配元素
{
data[i].uBokno=0;//书号清零成为一个空元素
fp=fopen("data","w+");
fwrite(data,MAXSIZE*sizeof(BookData),1,fp);
fclose(fp);
return;
}
}
printf("没有找到书号为%d的数据,删除失败!",iBuf);
getche();
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : EditData
// 功能描述 : 编辑数据
// 参数 : BookData data[MAXSIZE]
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
void EditData(BookData data[MAXSIZE])
{
FILE *fp;
unsigned int iBuf;
gotoxy(0,18);
printf("请输入你要编辑的书号:");
scanf("%d",&iBuf);
getchar();
for(int i=0;i<MAXSIZE;i++)//一个个元素找到所在数组位置
{
if(data[i].uBokno==iBuf)//找到了
{
gotoxy(0,19);
printf("输入书名:");
scanf("%s",&data[i].szBookName);
getchar();
printf("输入作者:");
scanf("%s",&data[i].szAuthor);
getchar();
printf("输入出版社:");
scanf("%s",&data[i].szPublic);
getchar();
printf("输入单价:");
scanf("%f",&data[i].uPrize);
getchar();
printf("输入数量:");
scanf("%d",&data[i].uQuantity);
getchar();
fp=fopen("data","w+");
fwrite(data,MAXSIZE*sizeof(BookData),1,fp);//写
fclose(fp);
return;
}
}
printf("没有找到书号为%d的数据,编辑失败!",iBuf);
}
///////////////////////////////////////////////////////////////////////
//
// 函数名 : OrderData
// 功能描述 : 排序
// 参数 : BookData data[MAXSIZE]
// 返回值 : void
//
///////////////////////////////////////////////////////////////////////
void OrderData(BookData data[MAXSIZE])
{
gotoxy(0,18);
printf("1.书号 2.书名 3.作者 4.出版社 5.单价 6.数量\n以哪个关键字进行排序?");
BookData data2[MAXSIZE];//新的排序后的数组
int i,j;//循环变量
unsigned int iLess=0,k;//暂存较小的项-整型
char szLess[12]="";//暂存较小的项-字符
float fLess=0;//暂存较小的项-浮点
FILE *fp;
bool IsUseNewData=true;//是不是真的进行了排序,作为最后是不是要将新数组写入文件的标准
switch(getche())
{
case 0x31:
for(i=0;i<MAXSIZE;i++)//填充新数组的循环
{
for(j=0;j<MAXSIZE;j++)//在旧数组中寻找的循环
{
if(data[j].uBokno)//是不是一个有效元素
{
if(iLess>=data[j].uBokno||iLess==0)//发现数组中比iLess还要小的项或是第一次填充iLess
{
iLess=data[j].uBokno;//复制过去
k=j;//记住是旧数组中第几项
}
}
}
memcpy(&data2[i],&data[k],sizeof(BookData));//内存copy将旧数组中某个元素复制到新元素中
iLess=0;//清零重新来
data[k].uBokno=0;//将旧数组元素无效
}
break;
case 0x32:
for(i=0;i<MAXSIZE;i++)
{
for(j=0;j<MAXSIZE;j++)
{
if(data[j].uBokno)
{
if(strcmp(szLess,data[j].szBookName)>=0||szLess[0]=='\0')//同前,strcmp可比较字符大小
{
strcpy(szLess,data[j].szBookName);
k=j;
}
}
}
memcpy(&data2[i],&data[k],sizeof(BookData));
szLess[0]='\0';
data[k].uBokno=0;
}
break;
case 0x33:
for(i=0;i<MAXSIZE;i++)
{
for(j=0;j<MAXSIZE;j++)
{
if(data[j].uBokno)
{
if(strcmp(szLess,data[j].szAuthor)>=0||szLess[0]=='\0')
{
strcpy(szLess,data[j].szAuthor);
k=j;
}
}
}
memcpy(&data2[i],&data[k],sizeof(BookData));
szLess[0]='\0';
data[k].uBokno=0;
}
break;
case 0x34:
for(i=0;i<MAXSIZE;i++)
{
for(j=0;j<MAXSIZE;j++)
{
if(data[j].uBokno)
{
if(strcmp(szLess,data[j].szPublic)>=0||szLess[0]=='\0')
{
strcpy(szLess,data[j].szPublic);
k=j;
}
}
}
memcpy(&data2[i],&data[k],sizeof(BookData));
szLess[0]='\0';
data[k].uBokno=0;
}
break;
case 0x35:
for(i=0;i<MAXSIZE;i++)
{
for(j=0;j<MAXSIZE;j++)
{
if(data[j].uBokno)
{
if(fLess>data[j].uPrize||fLess==0)
{
fLess=data[j].uPrize;
k=j;
}
}
}
memcpy(&data2[i],&data[k],sizeof(BookData));
fLess=0;
data[k].uBokno=0;
}
break;
case 0x36:
for(i=0;i<MAXSIZE;i++)
{
for(j=0;j<MAXSIZE;j++)
{
if(data[j].uBokno)
{
if(iLess>=data[j].uQuantity||iLess==0)
{
iLess=data[j].uQuantity;
k=j;
}
}
}
memcpy(&data2[i],&data[k],sizeof(BookData));
iLess=0;
data[k].uBokno=0;
}
break;
default:
printf("\n无效菜单序号,请重新输入!\nPress any key to continue!");
getche();
IsUseNewData=false;
break;
}
if(IsUseNewData)//没有进行过排序就不写文件夹袄
{
fp=fopen("data","w+");
fwrite(data2,MAXSIZE*sizeof(BookData),1,fp);
fclose(fp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -