我的这个代码的修改和删除功能运行错误,总是在修改以后整个txt文档就清零了,请问各位这个该怎么改,问题出在OLD_adjust()和OLD_delete()上
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
typedef struct people
{
char name[20]; //姓名
char IDnumber[20]; //学号
char phone[25]; // 手机号
char gdphone[20]; //固定电话
char sex[20]; //性别
int classNum; //班级
char roomID[20]; //宿舍
char email[20]; // EMAIL
char qq[20]; // qq号码
char classify[20]; //分类
} people;
people jh;
void UI_show(); //进入UI
void NEW_in(); //添加学生信息
void OLD_delete(); //删除学生信息
void OLD_find(); //学生信息查找
void OLD_findByNum(); //通过学号查找
void OLD_findByName(); //通过姓名查找
void OLD_adjust(); //修改学生信息
void OLD_delete(); //删除学生信息
void SORT_stu(); //排序
void UI_show1();
void UI_show2();
void UI_show3();
void UI_show4();
void UI_show5();
void UI_show6();
void UI_show7();
void UI_show()
{
int i;
for (i = 0; i < 30; i++)
{
printf("*");
}
printf("\n");
for (i = 0; i < 10; i++)
{
printf(" ");
}
printf("欢迎进入通讯录信息管理系统\n按任意键系统开始初始化显示通讯录......");
getchar();
printf("\n\n");
for (i = 0; i < 33; i++) //以下实现 菜单界面功能选择
{
printf(" ");
}
printf("请选择以下功能:\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("1、添加学生通讯录\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("2、修改学生通讯录\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("3、删除学生通讯录\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("4、查找通讯录信息\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("5、通讯录排序\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("6、退出系统\n");
printf("\n\n");
for (i = 0; i < 30; i++)
{
printf("*");
}
printf("\n\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("请选择:");
}
void NEW_in()
{
FILE *fp = NULL; //定义文件指针
fp = fopen("output.txt", "a"); //以追加的方式打开 文件
if (fp == NULL)
{
printf("\n通讯录还没有内容,请录入新的通讯录\n");
exit(0);
}
int classNum; //班级
char IDnumber[20]; //学号
char phone[20]; // 手机号
char gdphone[20]; //固定电话
char roomID[20]; //寝室
char email[20]; // EMAIL
char qq[20]; // qq号码
char sex[20]; //性别
char name[20];
char ch; //键盘输入选择
system("cls"); //清屏
UI_show1(); // 界面显示1;
while (1) //进入循环体,直到接收到信息 跳出循环
{
printf("请输入姓名:");
scanf("%s", name);
printf("请输入性别:");
scanf("%s", sex);
printf("请输入学号:");
scanf("%s", IDnumber);
printf("请输入联系电话:");
scanf("%s", phone);
printf("请输入固定电话:");
scanf("%s", gdphone);
printf("请输入电子邮箱:");
scanf("%s", email);
printf("请输入qq号码: ");
scanf("%s", qq);
printf("请输入宿舍:");
scanf("%s", roomID);
printf("请输入班级:");
scanf("%d", &classNum);
//缓冲区保存到文件
fprintf(fp, "%s %s %s %s %s %s %s %s %d \n", name, sex, IDnumber, phone, gdphone, email, qq, roomID, classNum);
do
{
printf("是否继续录入?请选择(Y/N)");
getchar(); //回车键
scanf("%c", &ch);
} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'n') || (ch == 'N'))
{
fclose(fp); //如果用户 输入N 则保存 并退出程序
break;
}
}
}
void OLD_adjust()
{
system("cls"); //清屏
people peopleI[100]; //建立结构体 数组
int sign = 0, i = 1, a, test;
char name[20], ch;
int classNum; //班级
char IDnumber[20]; //学号
char phone[20]; // 手机号
char gdphone[20]; //固定电话
char roomID[20]; //寝室
char email[20]; // EMAIL
char qq[20]; // qq号码
char sex[20]; //性别
FILE *fp = NULL; //文件指针
UI_show2(); // UI调用
fp = fopen("output.txt", "r+"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
}
printf("请输入要修改的学生姓名:");
scanf("%s", name);
while (!feof(fp)) //从文件中读取
{
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
i++; //记录行个数
}
printf("\n");
i--;
test = i; //保存 数据的行数
for (; i >= 0; i--)
{
a = strcmp(name, peopleI[i].name); //比较 输入的用户名 和文件中的用户名
if (a == 0)
{
sign = 1; //判断 赋值1 代表找到 该数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
do // 友情提示 选择
{
printf("你确定要修改该用户的信息吗?(Y/N):");
getchar();
scanf("%c", &ch);
} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'y') || (ch == 'Y')) //如果 选y则 录入信息
{
printf("请输入姓名:");
scanf("%s", name);
printf("请输入性别:");
scanf("%s", sex);
printf("请输入学号:");
scanf("%s", IDnumber);
printf("请输入联系电话:");
scanf("%s", phone);
printf("请输入固定电话:");
scanf("%s", gdphone);
printf("请输入电子邮箱:");
scanf("%s", email);
printf("请输入qq号码: ");
scanf("%s", qq);
printf("请输入宿舍:");
scanf("%s", roomID);
printf("请输入班级:");
scanf("%d", &classNum);
printf("修改成功!");
fclose(fp); //关闭文件
fp = fopen("output.txt", "w");
//将内存中 修改过的信息 重新写入文件
for(i=1;i<test;i++)
{
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
}
fclose(fp);
break; //跳出 for循环
}
else //假如不修改信息 再次写入文件
{
fclose(fp);
break;
}
}
}
if (sign == 0)
{
printf("没找到该用户!\n请按任意键继续....");
getchar();
}
}
//删除住户信息的功能
void OLD_delete()
{
// 先将硬盘文件中数据 保存到 内存缓冲区中,找到要删除的用户信息,删除后 重新写入文档
system("cls"); //清屏
people peopleI[10000]; //建立结构体 数组
int sign = 0, i = 1, a, test, j;
char name[20], ch;
FILE *fp = NULL; //文件指针
UI_show3();
fp = fopen("output.txt", "r");
if (fp == NULL)
{
printf("未找到文件!");
return; //返回 main函数
}
printf("请输入要删除的学生姓名:");
scanf("%s", name);
while (!feof(fp)) //从文件中读取,文件中数据转移到内存数组中区
{ //!feof(fp)只要文件不到末尾 就一直读下去
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
i++;
}
///------------------------------------
fclose(fp); //保存文件
printf("\n");
i--;
test = i; //保存 行数
for (; i >= 0; i--)
{
a = strcmp(name, peopleI[i].name); //比较 输入的用户名 和文件中的用户名
if (a == 0) //找到相应位置
{
sign = 1; // 标志 是否找到 数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
//显示出要修改的信息
do
{
printf("你确定要删除该用户的信息吗?(Y/N):");
getchar();
scanf("%c", &ch);
} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'y') || (ch == 'Y')) //假如 确定
{
printf("删除成功!");
fp = fopen("output.txt", "w"); //以写的方式打开,源文件被清除
for (j = 1; j < test; j++) //重新写入文件
{
if (j == i) // 不写入 第i个数据
{
//操作为空
}
else //否则 写入文件
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
}
fclose(fp); //关闭 保存缓冲区 文件
}
else //假如不修改信息 再次写入文件
{
fp = fopen("output.txt", "w"); //以写的方式打开,源文件被清除
for (i = 1; i < test; i++) //将内存中 修改过的信息 重新写入文件
{
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
}
fclose(fp);
}
}
}
if (sign == 0) //判断为未找到用户
{
printf("没找到该用户!\n请按回车键返回菜单选项.....");
getchar();
}
}
//查询
void OLD_find()
{
system("cls");
int temp;
UI_show5();
printf("1.按学号查询通讯录信息\t2.按姓名查询通讯录信息\n");
printf("请选择……");
scanf("%d", &temp);
switch (temp)
{
case 1:
system("cls");
OLD_findByNum();
break;
case 2:
system("cls");
OLD_findByName();
break;
default:
printf("\n\t\t\t输入错误! 按回车键返回重新选择");
}
_getch();
system("cls");
}
void OLD_findByNum()
// 先将硬盘文件中数据 保存到 内存缓冲区中,找到要用户信息,修改后 重新写入文档
{
system("cls"); //清屏
people peopleI[100]; //建立结构体 数组
int sign = 0, i = 1,test;
int p;
char IDnumber[20];
FILE *fp = NULL; //文件指针
fp = fopen("output.txt", "r"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
// exit(0);
}
printf("请输入要查询的学号:");
scanf("%s", IDnumber);
while (!feof(fp)) //从文件中读取
{
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
i++; //记录行的个数
}
printf("\n");
i--;
test = i; //保存 数据的行数
for (; i >= 0; i--)
{
//比较 输入的学号 和文件中的学号
p = strcmp(IDnumber, peopleI[i].IDnumber);
if (p == 0)
{
sign = 1; //判断 赋值1 代表找到 该数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
printf("\n");
fclose(fp); //关闭文件
}
else
{
fclose(fp);
}
}
if (sign == 0)
{
printf("没找到该学生信息!\n请按任意键继续....");
getchar();
}
}
void OLD_findByName()
// 先将硬盘文件中数据 保存到 内存缓冲区中,找到要用户信息,修改后 重新写入文档
{
system("cls"); //清屏
people peopleI[100]; //建立结构体 数组
int sign = 0, i = 1, test;
int p;
char name[10];
FILE *fp = NULL; //文件指针
void UI_show6(); // UI调用
fp = fopen("output.txt", "r"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
// exit(0);
}
printf("请输入要查询的姓名:");
scanf("%s", name);
while (!feof(fp)) //从文件中读取
{
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
i++; //记录行的个数
}
printf("\n");
i--;
test = i; //保存 数据的行数
for (; i >= 0; i--)
{
//比较 输入的姓名 和文件中的姓名
p = strcmp(name, peopleI[i].name);
if (p == 0)
{
sign = 1; //判断 赋值1 代表找到 该数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
printf("\n");
fclose(fp); //关闭文件
}
else //假如meiyou信息 再次写入文件
{
fclose(fp);
}
}
if (sign == 0)
{
printf("没找到该学生信息!\n请按任意键继续....");
getchar();
}
}
int NEW_oj() //判断文件是否是空
{
FILE *fp;
fp = fopen("output.txt", " r");
if (fp == NULL)
{
fp = fopen("output.txt", " w");
}
if (fgetc(fp) == EOF)
{
fclose(fp);
return 0;
}
else
{
return 1;
fclose(fp);
}
}
void SORT_stu() //排序
{
system("cls"); //清屏
people peopleI[100]; //建立结构体 数组
int i = 1, test, j;
FILE *fp = NULL; //文件指针
void UI_show7(); // UI调用
fp = fopen("output.txt", "r"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
// exit(0);
}
while (!feof(fp)) //从文件中读取
{
fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
i++; //记录行的个数
}
printf("\n");
i--;
test = i; //保存 数据的行数
for (i = 0; i < test; i++)
{
for (j = i + 1; j < test; j++)
{
if (peopleI[i].name > peopleI[j].name)
{
jh = peopleI[i];
peopleI[i] = peopleI[j];
peopleI[j] = jh;
}
}
}
for (i = 0; i < test; i++)
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
}
void UI_show1()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在添加通讯录学生信息,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show2()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在修改通讯录学生信息,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show3()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在删除通讯录学生信息,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show4()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用通讯录查询功能,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show5()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用按学号查找功能。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show6()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用按姓名查找功能。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show7()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用按姓名排序功能。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
int main()
{
int pan, p;
while (1)
{
p = NEW_oj(); //判断用户文件是否为空
if (p == 0)
{
printf("\n\n查询文件中未存在学生信息,请先进行信息录入!!!");
printf("\n请按回车键,进入信息添加系统.....");
getchar();
NEW_in();
}
system("cls"); //清屏
UI_show(); //调用 界面UI 显示
scanf("%d", &pan);
switch (pan)
{
case 1:
NEW_in();
break; //通讯录学生信息添加
case 2:
OLD_adjust();
break; //通讯录学生信息修改
case 3:
OLD_delete();
break; //通讯录学生信息删除
case 4:
OLD_find();
break; //查询通讯录学生信息
case 5:
SORT_stu();
break; //通讯录学生按姓名排序
case 6:
exit(0);
break; //退出系统
default:
printf("\n\t\t\t输入错误! 按回车键返回重新选择"); //按键错误反馈
}
_getch();
system("cls"); //清屏
}
system("pause");
return 0;
}
读取文件用fscanf() 函数,写入文件用 fprintf()函数,OLD_adjust()和OLD_delete() 里不管写入和读取文件,全用fscanf()函数。还有其他一些小问题,修改完善如下,供参考:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
typedef struct people
{
char name[20]; //姓名
char IDnumber[20]; //学号
char phone[25]; // 手机号
char gdphone[20]; //固定电话
char sex[20]; //性别
int classNum; //班级
char roomID[20]; //宿舍
char email[20]; // EMAIL
char qq[20]; // qq号码
char classify[20]; //分类
} people;
people jh;
void UI_show(); //进入UI
void NEW_in(); //添加学生信息
void OLD_delete(); //删除学生信息
void OLD_find(); //学生信息查找
void OLD_findByNum(); //通过学号查找
void OLD_findByName(); //通过姓名查找
void OLD_adjust(); //修改学生信息
void OLD_delete(); //删除学生信息
void SORT_stu(); //排序
void UI_show1();
void UI_show2();
void UI_show3();
void UI_show4();
void UI_show5();
void UI_show6();
void UI_show7();
void UI_show()
{
int i;
for (i = 0; i < 30; i++)
{
printf("*");
}
printf("\n");
for (i = 0; i < 10; i++)
{
printf(" ");
}
printf("欢迎进入通讯录信息管理系统\n按任意键系统开始初始化显示通讯录......");
getchar();
printf("\n\n");
for (i = 0; i < 33; i++) //以下实现 菜单界面功能选择
{
printf(" ");
}
printf("请选择以下功能:\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("1、添加学生通讯录\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("2、修改学生通讯录\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("3、删除学生通讯录\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("4、查找通讯录信息\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("5、通讯录排序\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("6、退出系统\n");
printf("\n\n");
for (i = 0; i < 30; i++)
{
printf("*");
}
printf("\n\n");
for (i = 0; i < 33; i++)
{
printf(" ");
}
printf("请选择:");
}
void NEW_in()
{
FILE* fp = NULL; //定义文件指针
fp = fopen("output.txt", "a"); //以追加的方式打开 文件
if (fp == NULL)
{
printf("\n通讯录还没有内容,请录入新的通讯录\n");
exit(0);
}
int classNum; //班级
char IDnumber[20]; //学号
char phone[20]; // 手机号
char gdphone[20]; //固定电话
char roomID[20]; //寝室
char email[20]; // EMAIL
char qq[20]; // qq号码
char sex[20]; //性别
char name[20];
char ch; //键盘输入选择
system("cls"); //清屏
UI_show1(); // 界面显示1;
while (1) //进入循环体,直到接收到信息 跳出循环
{
printf("请输入姓名:");
scanf("%s", name);
getchar();
printf("请输入性别:");
scanf("%s", sex);
getchar();
printf("请输入学号:");
scanf("%s", IDnumber);
getchar();
printf("请输入联系电话:");
scanf("%s", phone);
getchar();
printf("请输入固定电话:");
scanf("%s", gdphone);
getchar();
printf("请输入电子邮箱:");
scanf("%s", email);
getchar();
printf("请输入qq号码: ");
scanf("%s", qq);
getchar();
printf("请输入宿舍:");
scanf("%s", roomID);
getchar();
printf("请输入班级:");
scanf("%d", &classNum);
getchar();
//缓冲区保存到文件
fprintf(fp, "%s %s %s %s %s %s %s %s %d \n", name, sex, IDnumber,
phone, gdphone, email, qq, roomID, classNum);
do
{
printf("是否继续录入?请选择(Y/N)");
//getchar(); //回车键
scanf(" %c", &ch);
} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'n') || (ch == 'N'))
{
fclose(fp); //如果用户 输入N 则保存 并退出程序
break;
}
}
}
void OLD_adjust()
{
system("cls"); //清屏
people peopleI[1000]; //建立结构体 数组
int sign = 0, i = 0, a, test, j; // i = 1 修改
char name[20], ch;
//int classNum; //班级
//char IDnumber[20]; //学号
//char phone[20]; // 手机号
//char gdphone[20]; //固定电话
//char roomID[20]; //寝室
//char email[20]; // EMAIL
//char qq[20]; // qq号码
//char sex[20]; //性别
FILE* fp = NULL; //文件指针
UI_show2(); // UI调用
fp = fopen("output.txt", "r+"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
}
while (1) //从文件中读取
{
if (fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex,
peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email,
peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum) != 9) break;
i++; //记录行个数
}
fclose(fp); //修改
//printf("\n"); //修改
test = i; //保存 数据的行数
printf("请输入要修改的学生姓名:");
scanf("%s", name);
getchar();
for (i--; i >= 0; i--)
{
a = strcmp(name, peopleI[i].name); //比较 输入的用户名 和文件中的用户名
if (a == 0)
{
sign = 1; //判断 赋值1 代表找到 该数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name,
peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email,
peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
do // 友情提示 选择
{
printf("你确定要修改该用户的信息吗?(Y/N):");
//getchar();
scanf(" %c", &ch);
} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'y') || (ch == 'Y')) //如果 选y则 录入信息
{
printf("请输入姓名:");
scanf("%s", peopleI[i].name); //scanf("%s", name);
getchar();
printf("请输入性别:");
scanf("%s", peopleI[i].sex); //scanf("%s", sex);
getchar();
printf("请输入学号:");
scanf("%s", peopleI[i].IDnumber); //scanf("%s", IDnumber);
getchar();
printf("请输入联系电话:");
scanf("%s", peopleI[i].phone); //scanf("%s", phone);
getchar();
printf("请输入固定电话:");
scanf("%s", peopleI[i].gdphone); //scanf("%s", gdphone);
getchar();
printf("请输入电子邮箱:");
scanf("%s", peopleI[i].email); //scanf("%s", email);
getchar();
printf("请输入qq号码: ");
scanf("%s", peopleI[i].qq); //scanf("%s", qq);
getchar();
printf("请输入宿舍:");
scanf("%s", peopleI[i].roomID); //scanf("%s", roomID);
getchar();
printf("请输入班级:");
scanf("%d", &peopleI[i].classNum);//scanf("%d", &classNum);
getchar();
printf("修改成功!");
//fclose(fp); //关闭文件
fp = fopen("output.txt", "w");
//将内存中 修改过的信息 重新写入文件
for (j = 0; j < test; j++) //for (i = 1; i < test; i++)
{
fprintf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[j].name, peopleI[j].sex,
peopleI[j].IDnumber, peopleI[j].phone, peopleI[j].gdphone, peopleI[j].email,
peopleI[j].qq, peopleI[j].roomID, peopleI[j].classNum);
}
fclose(fp);
break; //跳出 for循环
}
else //假如不修改信息 再次写入文件
{
//fclose(fp);
printf("放弃修改操作!\n请按回车键返回菜单选项.....");
break;
}
}
}
if (sign == 0)
{
printf("没找到该用户!\n请按任意键继续....");
getchar();
}
}
//删除住户信息的功能
void OLD_delete()
{
// 先将硬盘文件中数据 保存到 内存缓冲区中,找到要删除的用户信息,删除后 重新写入文档
system("cls"); //清屏
people peopleI[1000]; //建立结构体 数组
int sign = 0, i = 0, a, test, j; //i = 1 修改
char name[20], ch;
FILE* fp = NULL; //文件指针
UI_show3();
fp = fopen("output.txt", "r");
if (fp == NULL)
{
printf("未找到文件!");
return; //返回 main函数
}
while (1) //从文件中读取,文件中数据转移到内存数组中区
{ //!feof(fp)只要文件不到末尾 就一直读下去
if (fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber,
peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID,
&peopleI[i].classNum) != 9) break;
i++;
}
//------------------------------------
fclose(fp); //关闭文件
printf("\n");
test = i; //保存 行数
printf("请输入要删除的学生姓名:");
scanf("%s", name);
getchar();
for (i = 0; i < test; i++) //修改
{
a = strcmp(name, peopleI[i].name); //比较 输入的用户名 和文件中的用户名
if (a == 0) //找到相应位置
{
sign = 1; // 标志 是否找到 数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n",
peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone,
peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
//显示出要修改的信息
do
{
printf("你确定要删除该用户的信息吗?(Y/N):");
//getchar();
scanf(" %c", &ch);
} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'y') || (ch == 'Y')) //假如 确定
{
for (j = i; j < test - 1; j++)
{
peopleI[j] = peopleI[j + 1];
//if (j == i) // 不写入 第i个数据
//{
//操作为空
//}
//else //否则 写入文件
}
test--;
printf("删除成功!");
fp = fopen("output.txt", "w"); //以写的方式打开,源文件被清除
for (j = 0; j < test; j++) { //重新写入文件
fprintf(fp, "%s %s %s %s %s %s %s %s %d\n", peopleI[j].name, peopleI[j].sex, peopleI[j].IDnumber,
peopleI[j].phone, peopleI[j].gdphone, peopleI[j].email, peopleI[j].qq, peopleI[j].roomID,
peopleI[j].classNum);
}
fclose(fp); //关闭 保存缓冲区 文件
break;
}
else //假如不修改信息 再次写入文件
{
//fp = fopen("output.txt", "w"); //以写的方式打开,源文件被清除
//for (i = 1; i < test; i++) //将内存中 修改过的信息 重新写入文件
//{
// fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex,
// peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email,
// peopleI[i].qq, peopleI[i].roomID, &peopleI[i].classNum);
//}
//fclose(fp);
printf("放弃删除操作!\n请按回车键返回菜单选项.....");
break;
}
}
}
if (sign == 0) //判断为未找到用户
{
printf("没找到该用户!\n请按回车键返回菜单选项.....");
getchar();
}
}
//查询
void OLD_find()
{
system("cls");
int temp;
UI_show5();
printf("1.按学号查询通讯录信息\t2.按姓名查询通讯录信息\n");
printf("请选择……");
scanf("%d", &temp);
switch (temp)
{
case 1:
system("cls");
OLD_findByNum();
break;
case 2:
system("cls");
OLD_findByName();
break;
default:
printf("\n\t\t\t输入错误! 按回车键返回重新选择");
}
_getch();
system("cls");
}
void OLD_findByNum()
// 先将硬盘文件中数据 保存到 内存缓冲区中,找到要用户信息,修改后 重新写入文档
{
system("cls"); //清屏
people peopleI[1000]; //建立结构体 数组
int sign = 0, i = 0, test; //i = 1
int p;
char IDnumber[20];
FILE* fp = NULL; //文件指针
fp = fopen("output.txt", "r"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
// exit(0);
}
while (1) //从文件中读取
{
if (fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber,
peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID,
&peopleI[i].classNum) != 9) break;
i++; //记录行的个数
}
fclose(fp); //关闭文件
printf("\n");
printf("请输入要查询的学号:");
scanf("%s", IDnumber);
getchar();
//
test = i; //保存 数据的行数
for (i--; i >= 0; i--)
{
//比较 输入的学号 和文件中的学号
p = strcmp(IDnumber, peopleI[i].IDnumber);
if (p == 0)
{
sign = 1; //判断 赋值1 代表找到 该数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n",
peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone,
peopleI[i].email, peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
printf("\n");
break; //fclose(fp); //关闭文件
}
//else
//{
//fclose(fp);
//}
}
if (sign == 0)
{
printf("没找到该学生信息!\n请按任意键继续....");
getchar();
}
}
void OLD_findByName()
// 先将硬盘文件中数据 保存到 内存缓冲区中,找到要用户信息,修改后 重新写入文档
{
system("cls"); //清屏
people peopleI[1000]; //建立结构体 数组
int sign = 0, i = 0, test; //i = 1
int p;
char name[10];
FILE* fp = NULL; //文件指针
void UI_show6(); // UI调用
fp = fopen("output.txt", "r"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
// exit(0);
}
while (1) //从文件中读取
{
if (fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber,
peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID,
&peopleI[i].classNum) != 9) break;
i++; //记录行的个数
}
fclose(fp);
printf("\n");
printf("请输入要查询的姓名:");
scanf("%s", name);
getchar();
//i--;
test = i; //保存 数据的行数
for (i--; i >= 0; i--)
{
//比较 输入的姓名 和文件中的姓名
p = strcmp(name, peopleI[i].name);
if (p == 0)
{
sign = 1; //判断 赋值1 代表找到 该数据
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name,
peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email,
peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
printf("\n");
break; //fclose(fp); //关闭文件
}
//else //假如meiyou信息 再次写入文件
//{
// fclose(fp);
//}
}
if (sign == 0)
{
printf("没找到该学生信息!\n请按任意键继续....");
getchar();
}
}
int NEW_oj() //判断文件是否是空
{
FILE* fp;
fp = fopen("output.txt", " r");
if (fp == NULL)
{
fp = fopen("output.txt", " w");
}
if (fgetc(fp) == EOF)
{
fclose(fp);
return 0;
}
else
{
fclose(fp);
return 1;
}
}
void SORT_stu() //排序
{
system("cls"); //清屏
people peopleI[100]; //建立结构体 数组
int i = 0, test, j; //i = 1
FILE* fp = NULL; //文件指针
void UI_show7(); // UI调用
fp = fopen("output.txt", "r"); //以读写的方式打开文件
if (fp == NULL) // 错误检测
{
printf("文件打开失败!请先添加用户信息!\n");
return;
// exit(0);
}
while (1) //从文件中读取
{
if (fscanf(fp, "%s %s %s %s %s %s %s %s %d", peopleI[i].name, peopleI[i].sex, peopleI[i].IDnumber,
peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email, peopleI[i].qq, peopleI[i].roomID,
&peopleI[i].classNum) != 9) break;
i++; //记录行的个数
}
fclose(fp);
printf("\n");
//i--;
test = i; //保存 数据的行数
for (i = 0; i < test - 1; i++) // 修改
{
for (j = i + 1; j < test; j++)
{
if (peopleI[i].name > peopleI[j].name)
{
jh = peopleI[i];
peopleI[i] = peopleI[j];
peopleI[j] = jh;
}
}
}
for (i = 0; i < test; i++)
printf("姓名%s,性别%s,学号%s,联系电话%s,固定电话%s,电子邮箱%s,qq%s,寝室%s,班级%d\n", peopleI[i].name,
peopleI[i].sex, peopleI[i].IDnumber, peopleI[i].phone, peopleI[i].gdphone, peopleI[i].email,
peopleI[i].qq, peopleI[i].roomID, peopleI[i].classNum);
}
void UI_show1()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在添加通讯录学生信息,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show2()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在修改通讯录学生信息,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show3()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在删除通讯录学生信息,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show4()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用通讯录查询功能,请根据提示输入信息。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show5()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用按学号查找功能。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show6()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用按姓名查找功能。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
void UI_show7()
{
int i;
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
for (i = 0; i < 15; i++)
{
printf(" ");
}
printf("你正在使用按姓名排序功能。\n");
for (i = 0; i < 75; i++) //数字 控制 上方 = 数量
{
printf("*");
}
printf("\n");
}
int main()
{
int pan, p;
while (1)
{
p = NEW_oj(); //判断用户文件是否为空
if (p == 0)
{
printf("\n\n查询文件中未存在学生信息,请先进行信息录入!!!");
printf("\n请按回车键,进入信息添加系统.....");
getchar();
NEW_in();
}
system("cls"); //清屏
UI_show(); //调用 界面UI 显示
scanf("%d", &pan);
switch (pan)
{
case 1:
NEW_in();
break; //通讯录学生信息添加
case 2:
OLD_adjust();
break; //通讯录学生信息修改
case 3:
OLD_delete();
break; //通讯录学生信息删除
case 4:
OLD_find();
break; //查询通讯录学生信息
case 5:
SORT_stu();
break; //通讯录学生按姓名排序
case 6:
exit(0);
break; //退出系统
default:
printf("\n\t\t\t输入错误! 按回车键返回重新选择"); //按键错误反馈
}
_getch();
system("cls"); //清屏
}
system("pause");
return 0;
}
修改和删除文件一般需要一个额外的文件将不需要修改的和修改过的信息储存进去,然后再存储回来
修改文件和写入是不一样的
写入是直接从头开始写,所以,文件其他内容就没了,删除也是类似
修改文件需要查询到文件要修改的记录位置,然后进行该记录的操作,你所用的函数是从文件头开始处理,所以会产生这个结果
https://blog.csdn.net/qq_43205256/article/details/123146703
可以看看
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。▼ http://bbs.csdn.net/topics/391975224