jsmds123 2022-06-27 00:09 采纳率: 100%
浏览 79
已结题

c语言,修改或删除某条数据导致所有数据都清零了

我的这个代码的修改和删除功能运行错误,总是在修改以后整个txt文档就清零了,请问各位这个该怎么改,问题出在OLD_adjust()和OLD_delete()上

我想要达到的结果:能正常修改和删除信息而不是把整个txt文档清零。
#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;
}


  • 写回答

4条回答 默认 最新

  • qzjhjxj 2022-06-27 10:34
    关注

    读取文件用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();    // 界面显示1while (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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 已采纳回答 6月27日
  • 创建了问题 6月27日

悬赏问题

  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应
  • ¥15 如何用字典的Key,显示在WPF的xaml中
  • ¥15 weautomate读取Excel表格信息然后填写到网页一直报错,如何解决?
  • ¥15 C#如何在Webview2中获取网页验证码
  • ¥15 esp32烧录失败,具体情况在图片上
  • ¥15 selenium安装报错
  • ¥15 在node.js中无法安装yarn
  • ¥15 python程序修改