求助一下,关于C语言 文件操作的小问题,如何删除文件内的一条信息
#include <stdio.h>#include <string.h>
#include <stdlib.h>
/****************************************** 所有数据结构定义 *******************************************/
typedef struct data
{
char num; //歌曲编号
char songname; //歌曲名
char writer; //曲作者
char singer; //歌手
char strokenum; //歌曲笔划
char type; //歌曲类型
char initsinger; //歌手名字首字母
char initwriter; //曲作者名字首字母
}DATA; //DATA为此结构体变量的类型名
/****************************************** 所有功能函数声明 *******************************************/
void NewSong(char*); //1.歌曲信息输入
void BrowseSong(char*); //2.歌曲信息浏览
void ModifySong(char*); //3.歌曲信息修改
void DeleteSong(char*); //4.歌曲信息删除
void Writer(); //5.曲作者名字的字母顺序
void Singer(); //6.歌手名字的字母顺序
void StrokeNum(); //7.歌曲名笔划排序
void SongType(); //8.歌曲类别
void SongNum(); //9.歌曲编号
int Choose(int); //10.选择函数
int JudgeNum(char*); //11.判断是否为数字
int JudgeDaxie(char*); //12.判断是否为大写字母
/****************************************** 所有功能函数定义 *******************************************/
void NewSong(char *fn)
{
DATA d1; //1000条歌曲信息
int i = 0, a = 0, j, k, ch1, ch2, ch3;
char ss;
char numx, songx, writerx, singerx, strokex, initw, inits;
char typex = { "民歌","美声","戏曲" ,"流行乐","外语歌曲","其他" };
FILE *fp;
if ((fp = fopen(fn, "a+")) == NULL) exit(0);//打开文件
do
{
mark0:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌曲编号(4位数字):");
scanf("%s", numx);
getchar();
system("cls");
if ((strlen(numx) != 4)||(JudgeNum(numx)==0))//检查合法性
{
printf("编号格式错误,请按回车键后,重新输入编号!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark0;
}
rewind(fp);//使位置指针fp重返回文件的开头
for (k = 0; feof(fp) == 0; k++)//判断文件指针fp在其所指的文件末
{
fscanf(fp, "歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d1.num, d1.songname, d1.writer, d1.initwriter, d1.singer, d1.initsinger, d1.strokenum, d1.type);
//printf("歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d1.num, d1.songname, d1.writer, d1.initwriter, d1.singer, d1.initsinger, d1.strokenum, d1.type);
}
for (j=0;d1.num != '\0';j++)//检查重复性
{
if (strcmp(d1.num, numx) == 0)
{
printf("此编号已存在,请按回车键后,重新输入编号!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark0;
}
}
j = 0;
strcpy(d1.num, numx);
mark1:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌曲名(不超过10位汉字):");
scanf("%s", songx);
getchar();
system("cls");
if ((strlen(songx) > 20) || (strlen(songx) == 0))//检查合法性
{
printf("歌曲名格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark1;
}
strcpy(d1.songname, songx);
mark2:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入曲作者名(不超过10位汉字):");
scanf("%s", writerx);
getchar();
system("cls");
if ((strlen(writerx) > 20) || (strlen(writerx) == 0))//检查合法性
{
printf("曲作者名格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark2;
}
strcpy(d1.writer, writerx);
mark3:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入曲作者名首字母(1位大写英文字母):");
scanf("%s", initw);
getchar();
system("cls");
if ((strlen(initw) != 1) || (JudgeDaxie(initw) == 0))//检查合法性?
{
printf("格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark3;
}
strcpy(d1.initwriter, initw);
mark4:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌手名(不超过10位汉字):");
scanf("%s", singerx);
getchar();
system("cls");
if ((strlen(singerx) > 20) || (strlen(singerx) == 0))//检查合法性
{
printf("歌手名格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark4;
}
strcpy(d1.singer, singerx);
mark5:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌手名首字母(1位大写英文字母):");
scanf("%s", inits);
getchar();
system("cls");
if ((strlen(inits) != 1) || (JudgeDaxie(inits) == 0))//检查合法性
{
printf("格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark5;
}
strcpy(d1.initsinger, inits);
mark6:
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("请输入歌曲名笔划(数字):");
scanf("%s", strokex);
getchar();
system("cls");
if ((strlen(strokex) != 1) || (JudgeNum(strokex) == 0))//检查合法性
{
printf("格式错误,请按回车键后,重新输入!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark6;
}
strcpy(d1.strokenum, strokex);
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("*******************\n");
printf("** 1.民歌 **\n");
printf("** 2.美声 **\n");
printf("** 3.戏曲 **\n");
printf("** 4.流行乐 **\n");
printf("** 5.外语歌曲 **\n");
printf("** 6.其他 **\n");
printf("*******************\n");
printf("最后请选择歌曲类型(1-6):");
//getchar();
ch2 = Choose(6);
strcpy(d1.type, typex);
//getchar();
system("cls");
system("cls");
printf("******************** 添加新歌曲信息 ********************\n\n");
printf("您将添加的歌曲信息如下:\n\n");
printf("歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n",d1.num, d1.songname, d1.writer, d1.initwriter,d1.singer, d1.initsinger,d1.strokenum,d1.type);
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否保存此条歌曲信息:");
ch3 = Choose(2);
system("cls");
if (ch3 == 1)
{
fprintf(fp, "歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d1.num, d1.songname, d1.writer, d1.initwriter, d1.singer, d1.initsinger, d1.strokenum, d1.type); //将数据格式化输出到文件中
printf("已保存此条歌曲信息!\n按回车键进行下一步!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
else
{
printf("未保存此条歌曲信息!\n按回车键进行下一步!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
i++;
system("cls");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否继续添加下一条歌曲信息:");
ch1 = Choose(2);
if (ch1 == 1)
a = 0;
else if (ch1 == 2)
a = 1;
} while (a==0);
fclose(fp);
}
void BrowseSong(char *fn)
{
int k;
DATA d2;
FILE *fp;
if ((fp = fopen(fn, "r")) == NULL) exit(0);//打开文件
printf("*******************************************************************************************************************************************************************************\n");
printf("** 所有歌曲 **\n");
rewind(fp);//使位置指针重返回文件的开头
for (k = 0; feof(fp) == 0; k++)
{
fscanf(fp, "歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d2.num, d2.songname, d2.writer, d2.initwriter, d2.singer, d2.initsinger, d2.strokenum, d2.type);
//printf("歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d2.num, d2.songname, d2.writer, d2.initwriter, d2.singer, d2.initsinger, d2.strokenum, d2.type);
printf("歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d2.num, d2.songname, d2.writer, d2.initwriter, d2.singer, d2.initsinger, d2.strokenum, d2.type);
}
printf("*******************************************************************************************************************************************************************************\n");
fclose(fp);
}
void ModifySong(char *fn)
{
}
void DeleteSong(char *fn)
{
DATA d3;
char numx;
char ss,c;
int i,k,ch1,ch2,ch3;
int len = 0;
FILE *fp;
mark2:
BrowseSong(fn);//显示所有歌曲
if ((fp = fopen(fn, "a+")) == NULL) exit(0);//打开文件
printf("请输入要删除的歌曲信息的编号:");
scanf("%s", numx);
getchar();
system("cls");
rewind(fp);//使位置指针重返回文件的开头
for (k = 0; feof(fp) == 0; k++)
{
fscanf(fp, "歌曲编号:%s\t 歌曲名称:%s\t 作曲者:%s\t 曲作首:%s\t 歌手:%s\t 歌手首:%s\t 歌曲笔划:%s\t 歌曲类型:%s\t \n", d3.num, d3.songname, d3.writer, d3.initwriter, d3.singer, d3.initsinger, d3.strokenum, d3.type);
if (strcmp(d3.num, numx) == 0)
{
printf("您将要删除的歌曲信息为:\n");
printf("歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d3.num, d3.songname, d3.writer, d3.initwriter, d3.singer, d3.initsinger, d3.strokenum, d3.type);
goto mark1;
}
}
k = 0;
printf("不存在此歌曲编号,按回车键后重新输入!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark2;
mark1:
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否删除此条歌曲信息:");
ch1 = Choose(2);
system("cls");
if (ch1 == 1)
{
//删除操作(未完成)
while ((c=fgetc(fp))!=EOF)
{
if(c=='\n')
len++;
}
for (;k<(len-1);k++)//10
{
d3 = d3;
}
for (i = 0;i<(len - 1);i++)
{
rewind(fp);//使位置指针重返回文件的开头
fprintf(fp, "歌曲编号:%-5s\t 歌曲名称:%-20s\t 作曲者:%-10s\t 曲作首:%-2s\t 歌手:%-10s\t 歌手首:%-2s\t 歌曲笔划:%-2s\t 歌曲类型:%-8s\t \n", d3.num, d3.songname, d3.writer, d3.initwriter, d3.singer, d3.initsinger, d3.strokenum, d3.type);
}
len=0;
printf("已删除此条歌曲信息!\n");
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否继续删除其他歌曲信息:");
ch3 = Choose(2);
system("cls");
if (ch3 == 1)
{
goto mark2;
}
}
else if (ch1 == 2)
{
printf("已取消删除此条歌曲信息!\n");
printf("\n");
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否继续删除其他歌曲信息:");
ch2 = Choose(2);
system("cls");
if (ch2 == 1)
{
goto mark2;
}
}
fclose(fp);
}
void Writer()
{
}
void Singer()
{
}
void StrokeNum()
{
}
void SongType()
{
}
void SongNum()
{
}
int Choose(int n)
{
char x;//防止恶意输入长字符串,溢出
int ch = 0;
char num = { "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30" };
int i;
while (ch == 0)
{
gets(x);
fflush(stdin);
for (i = 0;i<n;i++)
{
if (strcmp(x, num) == 0)
{
ch = i + 1;
return ch;
}
}
printf("对不起,没有这个选项。请重新输入!\n");
}
}
int JudgeNum(char *num)
{
int i;
for (i = 0;num!='\0';i++)
{
if ((num < '0') || (num > '9'))
return 0;//含其他字符
}
return 1; //纯数字
}
int JudgeDaxie(char *zimu)
{
int i;
for (i = 0;zimu;i++)
{
if ((zimu < 'A') || (zimu > 'Z'))
return 0; //含其他字符
}
return 1; //大写字母
}
/****************************************** 主函数 *******************************************/
int main()
{
char filename;
//scanf("%s",filename);
FILE *fp;
//if ((fp = fopen(filename, "a+")) == NULL) exit(0);//打开文件
//fclose(fp);
FILE *mima;
char ss;
char ch0, ch1, ch2, ch3, ch4;
char password,pw;
int a = 0;
printf("\n");
printf("*********************************************************************************************\n");
printf("*** ***\n");
printf("*** 欢迎使用点歌台! ***\n");
printf("*** ***\n");
printf("*********************************************************************************************\n");
printf("\n\n");
printf("按回车键开始使用点歌台!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
do
{
system("cls");
printf("\n");
printf("*****************************************************************\n");
printf("** **\n");
printf("** 点歌台 **\n");
printf("** **\n");
printf("** 1.管理员操作 **\n");
printf("** 2.顾客点歌台 **\n");
printf("** 3.歌曲播放列表 **\n");
printf("** 4.退出系统 **\n");
printf("** **\n");
printf("*****************************************************************\n");
printf("请输入选择项(1-4):");
ch0 = Choose(4);
system("cls");
if (ch0 == 4)//退出系统
{
system("cls");
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 谢谢使用! **\n");
printf("** 再见! **\n");
printf("** **\n");
printf("***********************************\n");
printf("\n\n");
//getchar();
printf("按回车键关闭程序!\n");
scanf("%c", &ss);
exit(0);
}
if (ch0 == 1)//管理员操作
{
if ((mima = fopen("mima.dat", "r")) == NULL)
{
mima = fopen("mima.dat", "w+");
mark1:
system("cls");
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 管理员操作 **\n");
printf("** **\n");
printf("***********************************\n");
printf("首次使用系统,请设置管理员密码(六位字符):");
scanf("%s", password);
getchar();
system("cls");
if (strlen(password) != 6)//密码长度
{
printf("密码格式错误,请按回车键后,重新设置密码!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark1;
}
printf("!!!您设置管理员密码为:%s\n\n",password);
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否使用此密码:");
ch2 = Choose(2);
if (ch2 == 2)
goto mark1;
if (ch2 == 1)
{
fprintf(mima,"%s",password);
fclose(mima);
}
fflush(stdin);//清空输入缓存
system("cls");
}
mark:
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 管理员操作 **\n");
printf("** **\n");
printf("***********************************\n");
printf("输入管理员密码:");
scanf("%s", pw);
system("cls");
getchar();
fgets(password,7,mima);
if (strcmp(password, pw) == 0)
{
do
{
while (a == 0) /*********************************** 建立歌曲信息文件 **************************************/
{
printf("\n请建立歌曲信息文件!\n");
printf("\n请输入文件名:\n");
scanf("%s", filename);
getchar();
if ((fp = fopen(filename, "r+")) == NULL)
{
if ((fp = fopen(filename, "w+")) == NULL) exit(0);//打开文件
printf("\n新建歌曲信息文件成功!\n");
printf("\n按回车键开始使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
else
{
system("cls");
printf("%s此歌曲信息文件已存在!\n",filename);
printf("**************************\n");
printf("** **\n");
printf("** 1.继续使用 **\n");
printf("** 2.覆盖使用 **\n");
printf("** **\n");
printf("**************************\n");
printf("请选择继续使用或覆盖:");
ch4 = Choose(2);
if (ch4 == 1)
{
system("cls");
printf("将继续使用原文件!\n");
//if ((fp = fopen(filename, "a+"))== NULL)exit(0);
printf("\n按回车键开始使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
if (ch4 == 2)
{
system("cls");
printf("已覆盖原文件!\n");
if ((fp = fopen(filename, "w+")) == NULL)exit(0);
printf("\n按回车键开始使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
}
}
fclose(fp);
a = 1;
};
/************************************************* 管理员功能 ******************************************************/
system("cls");
printf("\n");
printf("****************************************************************\n");
printf("** **\n");
printf("** 管理员 **\n");
printf("** **\n");
printf("** 1.歌曲信息输入 **\n");
printf("** 2.歌曲信息浏览 **\n");
printf("** 3.歌曲信息修改 **\n");
printf("** 4.歌曲信息删除 **\n");
printf("** 5.修改管理密码 **\n");
printf("** 6.返回上一页面 **\n");
printf("** **\n");
printf("****************************************************************\n");
printf("请输入选择项(1-6):");
ch1 = Choose(6);
system("cls");
if (ch1 == 1)//新增歌曲信息
{
NewSong(filename);
//getchar();
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 2)//查看歌曲信息
{
BrowseSong(filename);/*查看所有歌曲的函数*/
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 3)//修改歌曲信息
{
/*修改歌曲信息的函数*/
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 4)//删除歌曲信息
{
DeleteSong(filename);/*删除歌曲信息的函数*/
printf("\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 5)//修改管理密码
{
mima = fopen("mima.dat", "r+");
mark2:
system("cls");
printf("\n");
printf("***********************************\n");
printf("** **\n");
printf("** 管理员操作 **\n");
printf("** **\n");
printf("***********************************\n");
printf("请设置新的管理员密码(六位字符):");
scanf("%s", password);
getchar();
system("cls");
if (strlen(password) != 6) //密码长度
{
printf("密码格式错误,请按回车键后,重新设置密码!");
scanf("%c", &ss);
fflush(stdin);//清空输入缓存
goto mark2;
}
printf("!!!您设置管理员密码为:%s\n\n", password);
printf("******************\n");
printf("** **\n");
printf("** 1.是 **\n");
printf("** 2.否 **\n");
printf("** **\n");
printf("******************\n");
printf("请选择是否使用此密码:");
ch2 = Choose(2);
if (ch2 == 2)
goto mark2;
if (ch2 == 1)
{
fprintf(mima, "%s", password);
fclose(mima);
}
system("cls");
printf("\n修改密码成功!\n按回车键继续使用管理员功能!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
}
if (ch1 == 6)
break; //返回主菜单
} while (1);
}
else
{
printf("\n密码错误,请按回车键后重新输入!\n");
scanf("%c", &ss);
fflush(stdin);
system("cls");
goto mark;
}
}
if (ch0 == 2)//顾客点歌台
{
do
{
printf("\n");
printf("***********************************************************\n");
printf("** **\n");
printf("** 顾客点歌台 **\n");
printf("** **\n");
printf("** 1.按歌曲曲作者名字的字母顺序显示歌曲 **\n");
printf("** 2.按歌手名字的字母顺序显示歌曲 **\n");
printf("** 3.按歌曲名笔划排序显示歌曲 **\n");
printf("** 4.按歌曲类别显示歌曲 **\n");
printf("** 5.直接输入歌曲编号 **\n");
printf("** 6.返回主菜单 **\n");
printf("** **\n");
printf("***********************************************************\n");
printf("请输入选择项(1-6):");
ch3 = Choose(6);
system("cls");
if (ch3 == 6)//返回主菜单
{
break;
}
if (ch3 == 1)//曲作者名字字母顺序
{
}
if (ch3 == 2)//歌手名字的字母顺序
{
}
if (ch3 == 3)//歌曲名笔划排序
{
}
if (ch3 == 4)//歌曲类别
{
}
if (ch3 == 5)//歌曲编号
{
}
}while(1);
}
if (ch0 == 3)//歌曲播放列表
{
}
}while (1);
return 0;
}
请大佬帮我悄悄第271行,void DeleteSong(char *fn)这个函数哪里写错了,实在不知道咋回事
页:
[1]