「已注销」 2022-12-20 01:14 采纳率: 91.2%
浏览 21
已结题

通讯管理系统,在我运行之后,如图所示输入之后,Save函数没起到作用,文本文件里没有内容。

通讯管理系统,在我运行之后,如图所示输入之后,Save函数似乎没有起到作用,我看了文本文件,里面还是没有内容,而且在Save函数下面的一条语句也没有输出(返回主菜单),请问这是怎么回事?我试着在Save函数中,关闭文件后面加了一句输出语句,发现也没有执行。

img


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef int ElemType;
typedef struct {
    char name[10];        //姓名
    char road[10];        //街道
    char city[10];        //城市
    char code[10];        //邮编
    char country[10];    //国家
}person;
typedef struct node {
    person data;        //数据域
    struct node* prior;    //前驱
    struct node* next;    //后继
}ListNode, * LinkList;
LinkList InitList();                //构造一个空的线性表
LinkList Create(LinkList head);        //创建线性表
void Enter(LinkList head);            //输入通讯录信息 
void Save(LinkList head);            //将信息存入文件 
LinkList InitList()
{
    LinkList head = (LinkList)malloc(sizeof(ListNode));        //创建头节点
    if (head == NULL)
    {
        printf("\n建立链表失败!\n");
        exit(-1);                    //退出程序
    }
    head->next = NULL;
    head->prior = NULL;
    return head;
}
LinkList Create(LinkList head)
{
    person LM;                        //定义一个person类型的数据LM        /////////
    LinkList rear;                    /////////
    rear = head;                    /////////    
    FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\学生信息.txt", "r");    //以文本只读打开文件
    if (fp == NULL)
    {
        printf("\n文件打开失败!\n");
        return NULL;
    }
    while (fscanf(fp, "%s%s%s%s%s", LM.name, LM.road, LM.city, LM.code, LM.country) != EOF)    //从文件读入,处理到文件尾
    {
        LinkList s = (LinkList)malloc(sizeof(ListNode));
        s->data = LM;
        s->prior = NULL;
        s->next = NULL;

        rear->next = s;
        s->prior = rear;
        rear = rear->next;
    }
    fclose(fp);
    return head;
}

void Save(LinkList head)
{
    LinkList rear;
    person LM;
    rear=head->next;//跳过头节点 
    FILE *fp;
    int i;
    if((fp=fopen("C:\\Users\\Lenovo\\Desktop\\学生信息.txt","wb"))==NULL)/*只打开或建立一个二进制文件,只允许写数据*/
    {
        printf("\n文件不存在!\n");
    }
    while(rear)//处理到文件尾 
    {  
        LM=rear->data;
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\n", LM.name, LM.road, LM.city, LM.code, LM.country);
        rear=rear->next;
    }
    fclose(fp);
}

void Menu(LinkList head)                        //输出菜单
{
    int n;
    int flag=0;
    do{
        printf("-----------------------------------------------------\n");
        printf("---------------->>通讯管理系统<<---------------------\n");
        printf("--------------------->>主菜单<<----------------------\n");
        printf("-----------------------------------------------------\n");
        printf("*    1、输入联系人信息   *    2、显示联系人信息    *\n");
        printf("-----------------------------------------------------\n");
        printf("*    3、查找联系人信息   *    4、删除联系人信息    *\n");
        printf("-----------------------------------------------------\n");
        printf("*    5、存盘             *    6、装入              *\n");
        printf("-----------------------------------------------------\n");
        printf("*    7、退出系统         *                          *\n");
        printf("-----------------------------------------------------\n");
        printf("\n请输入菜单编号:\n"); 
        scanf("%d",&n);
        if(n<1||n>7)
        {
           system("cls");
           printf("选择错误!  请重新选择!\n");
           system("pause");
           flag=1;
        }
        else
        {
            break;
        }
    }while(flag=1);
    switch (n)
        {
            case 1:Enter(head); break;
        //    case 2:Display(head); break;
        //    case 3:Search(head); break;
        //    case 4:Delete(head); break;
            case 5:Save(head); break;
        //    case 6:Load(head); break;
        //    case 7:Quit(head);break; 
            default:printf("输入有误!");
        }
}
void Enter(LinkList head)                //输入
{
    person    LM;
    char c;
    LinkList p = head;
    printf("姓名 街道 城市 邮编 国家\n");
        scanf("%s", LM.name);
        scanf("%s", LM.road);
        scanf("%s", LM.city);
        scanf("%s", LM.code);
        scanf("%s", LM.country);
        LinkList s = (LinkList)malloc(sizeof(ListNode));
        s->data = LM;
        s->next = p->next;
        s->next->prior = s;
        s->prior = p;
        while (p->next)
        {
            p = p->next;
        }
        p->next = s;
        Save(head);                    //调用存盘函数
    printf("\n返回主菜单!\n");
    system("pause");
    Menu(head);
}

int main()
{
    LinkList head = InitList();
    head = Create(head);
    Menu(head);
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2022-12-20 08:56
    关注

    看错误信息是scanf语句有错误造成的
    scanf_s("%s", LM.name);
    改为
    scanf_s("%s", LM.name,10);
    后面的scanf_s输入字符串时都要这么改,最后加个参数表示字符串允许最大长度
    这是scanf_s与scanf的区别。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 修改了问题 12月20日
  • 创建了问题 12月20日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号