weixin_52939239
2021-04-17 00:58
采纳率: 100%
浏览 37

加粗下滑线处的 fopen() 调试时一直发断点,怎么修改才正确?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

//--------------------ATM机模拟操作程序的设计--------------------------------------

typedef struct Accout     //账户信息
{
    char name[20];    //姓名
    char no[20];      //账号
    char pwd[7];     //密码
    int balance;  
    struct Accout* next;                    //余额
}accout;

typedef struct Record  //账户存取转账记录
{
    char no[20];
    char way[30];
    int number;
    struct Record* next;
}Record;
struct Accout* head = NULL;   //文件缓冲区数据的开头
struct Accout* end = NULL;    //文件缓冲区数据的尾部指针
struct Accout* head2 = NULL;  //登入后账号数据的开头指针地址

//---------------------------我是分割线---------------------------------------------------------
int main()                    //主函数
{
    
    //主函数页面:页面功能选项设计--->swich()选择功能--->
    char choose;

    void menu();
    void kaihu();
    void denglu();   
    struct Accout* p_1=NULL, * p_2 = NULL;
    FILE* fpm;
    if ((fpm = fopen("a1.txt", "r") == NULL))
    {
        printf("打开文件失败");
        exit(0);
    }
    else
        fpm = (fopen("a1.txt", "r"));
    p_1 = ((struct Accout*)malloc(sizeof(struct Accout)));
    end=head = p_1;           //整个文件数据的开头地址,若文件中没有数据时,同时也时文件的结尾
    while(!feof(fpm))
    {
        if (1 != fread(p_1, sizeof(struct Accout), 1, fpm))
            break;
        p_1->next = ((struct Accout*)malloc(sizeof(struct Accout)));    //p->next指向下个数据地址的开头
        p_2 = p_1;                //保存当前数据的结点地址,使到最后一个数据时可以是p->next=NULL
        p_1 = p_1->next;      //刷新p_1指向下一个数据的开头
    }
    if (p_2 != NULL)
    {
        end = p_2;
    }
    p_2 = NULL;
    fclose(fpm);
    printf("\n\n *******************欢迎使用自动存取款系统***************\n");
    printf("**\t\t\t\t\t\t\t**\n");
    printf("**\t\t\t\t\t\t\t**\n");
    printf("**\t\t①登入\t\t②开户\t\t\t**\n");
    printf("**\t\t\t\t\t\t\t**\n");
    printf(" ********************************************************");
    printf("\n请输入选择序号:");
    //选择的序号字符
    choose = getchar();
    switch (choose)
    {
    case '1':system("cls");
        denglu();
        break;        //调用函数登入
    case '2':system("cls");//清屏
        kaihu();   //调用函数开户
        break;
    }

    return 0;
}

void kaihu()         //创建账户
{
    /* 姓名,卡号,密码,余额
    typedef struct Accout     账户信息
    {
        char name[20];    //姓名
        char no[20];      //账号
        char pwd[7];     //密码
        int balance;      //余额
    }Accout; */
    FILE* fp;
    struct Accout * p1 = NULL;    
    struct Accout * p2 = NULL;    
    head2= p1 = ((struct Accout* )malloc(sizeof(struct Accout)));            //开辟内存空间,程序缓冲区
    end->next = head2;
    printf("请输入您的姓名:");
     scanf_s("%s",p1->name,230);
     srand( time(NULL));
     sprintf(p1->no, "%d%d%d%d%d", rand() % 10000,
         rand() % 10000,
         rand() % 10000,
         rand() % 10000,
         rand() % 1000);            //格式化字符输出sprintf
     printf("\n您的卡号为:%s",p1->no);
     char pwd_1[7];
     char pwd_2[7];
     do {
         printf("\n请输入您的密码:");
         scanf_s("%s",pwd_1,7);
         printf("\n请再次输入您的密码:");
         scanf_s("%s", pwd_2, 7);
         if (strcmp(pwd_1, pwd_2) != 0)
             printf("输入的俩次密码不相同,请重新输入");

     } while (strcmp(pwd_1, pwd_2) != 0);
     strcpy(p1->pwd, pwd_1);
     p1->balance = 0;
     printf("账户余额为:%d\n", p1->balance);
     
     if ((fp = (fopen("a1.txt", "b")) == NULL))
     {
         printf("打开文件失败");
         exit(0);
     }
     else
         fp = fopen("a1.txt", "b");

     if((fwrite(p1, sizeof(struct Accout), 1, fp))==1);
         printf("开户成功");
     fclose(fp);
     printf("任意输入一个数字,继续进行操作: ");
     int a;
     scanf_s("%d", &a);
     void menu();
     menu();    
}
//---------------------------------------------
void denglu()      //-------账号登录函数 ------------    
                                    
{
    
    char no[20];
    char pwd[7];
    printf("请输入账号:");
    scanf_s("%s",no,19);
    struct Accout* p_3;
    p_3 = head;
    for (; p_3 != NULL; p_3 = p_3->next)
    {
        if (strcmp(no, p_3->no) != 0)
            continue;
        else
            break;
    }
    
    for (int i = 0; i < 3; i++)
    {
        printf("请输入密码");
        scanf_s("%s",pwd,6);
        if (strcmp(pwd, p_3->pwd))
            break;
    }
    if (strcmp(pwd, p_3->pwd))
    {
        head2 = p_3;
        void menu();
        menu();
    }
     else
     {
         printf("密码三次输入错误,结束程序");
     }
}

//------------------------------------------------------------
void inquiry() //查询
{
    
    printf("姓名:%s\n账号:%s\n余额:%d\n ", head2->name, head2->no, head2->balance);
    printf("任意输入一个数字,继续进行操作: ");
    int a ;
    scanf_s("%d",&a);
    void menu();
    menu();
 }
//----------------------------------------------------------------------------------------------
void transfer()   //转账函数
{    
    char no[20];
    int number;
    struct Accout* kahao;     //转账对象的指针
    
    struct Accout* p;
    FILE* fp;
    printf("请输入要转账给另一个账户的卡号:");
    scanf_s("%s",no,19);
    for (kahao = head; kahao!= NULL; kahao= kahao->next)   //遍历寻找账户
    {
        if (strcmp(no, kahao->no) != 0)
            continue;
        else
            break;
    }
    printf("\n请输入转账的金额:");
    scanf_s("%d", &number);
    head2->balance -= number;
    kahao->balance += number;
    fp =fopen("a1.txt", "w");
    p = head;
    for (;p!=NULL;p=p->next)   //将缓冲区的数据全部写入文件,已覆盖方式
    {
        fwrite(p, sizeof(struct Accout), 1, fp);
    }
    fclose(fp);
    printf("转账成功,当前账户余额为:%d",head2->balance);
    printf("\n任意输入一个数字,继续进行操作");
    int a;
    scanf_s("%d", &a);
    void menu();
    menu();    
}
//----------------------------------------------------
void cunkuan()   //存款函数
{
    int number;
    struct Accout * p;
    FILE* fp;
     
    printf("请输入需要存的金额:");
    scanf_s("%d", &number);
    head2->balance += number;
    if((fp= fopen("a1.txt", "w"))==NULL)
    {
        printf("文件打开失败");
        exit(0);
    }
    else{
        p = head;
      for (; p != NULL; p = p->next)   //将缓冲区的数据全部写入文件,已覆盖方式
      {
        fwrite(p, sizeof(struct Accout), 1, fp);
      }
    }
    fclose(fp);
    printf("\n当前账户余额为:%d", head2->balance);
    printf("\n任意输入一个数字,继续进行操作");
    int a;
    scanf_s("%d", &a);
    menu();
}
void qukuan() 
{
    int number;
    struct Accout * p;
    FILE* fp;
    
    printf("请输入取款金额:");
    scanf_s("%d", &number);
    for (; head2->balance - number < 0;)
    {
        printf("\n余额不足,请重新输入:");
        scanf_s("%d", &number);
    }
    head2->balance -= number;
    if ((fp = fopen("a1.txt","w")) == NULL)
    {
        printf("文件打开失败");
        exit(0);
    }
    else
    {
        for (p=head; p!= NULL; p =p->next)   //将缓冲区的数据全部写入文件,已覆盖方式
        {
            fwrite(p, sizeof(struct Accout), 1, fp);
        }
    }
    fclose(fp);
    printf("当前余额为:%d", head2->balance);
    printf("\n任意输入一个数字,继续进行操作: ");
    int a;
    scanf_s("%d", &a);
    void menu();
    menu();
}
void change_password()    //更改密码函数
{
    char pwd[7];
    char pwd_2[7];
    for(; strcmp(pwd, pwd_2) != 0;)
    {
     printf("请输入新密码:");
     scanf_s("%s",pwd,6);
     printf("请再一次输入密码:");
    scanf_s("%s",pwd_2,6);
     if (strcmp(pwd, pwd_2) != 0)
         printf("俩次输入的密码不一样");
    }
    strcpy(head2->pwd, pwd);
    FILE* p;
    FILE* fp;
    
    if ((fp = fopen("a1.txt", "w")) == NULL)
    {
        printf("文件打开失败");
        exit(0);
    }
    else
    {
        p = head;
        for (; p != NULL; p = head->next)   //将缓冲区的数据全部写入文件,以覆盖方式
        {
            fwrite(p, sizeof(struct Accout), 1, fp);
        }
    }
    fclose(fp);
    printf("\n任意输入一个数字,继续进行操作: ");
    int a;
    scanf_s("%d", &a);
    void menu();
    menu();
}
void quit()
{
    printf("\t\t\t\t欢迎下次使用");
    head=head2 = NULL;
}

void menu()          //菜单函数
{
     
    
    char ch;
    printf("                           ");
    printf("                                                  \n");
    printf("       *******欢迎使用自动存取款系统*****************\n");
    printf("**\n");
    printf("       *      --------                    --------     *\n");
    printf("       *  │ ①查询│                 │ ④存款│     *\n");
    printf("       *      --------                    --------     *\n");
    printf("**\n");
    printf("       *                --------     *\n");
    printf("       *     │ ②转账│             │ ⑤取款│     *\n");
    printf("       *      ----         --------     *\n");
    printf("*                                                     *\n");
    printf("       *               --------     *\n");
    printf("       *     │ ③改密│              │ ⑥退出│     *\n");
    printf("       *                  --------     *\n");
    printf("*                                                     *\n");
    printf("******************************************************\n\n\n");
    printf("  请选择: ");
    ch = getchar();
    switch (ch)
    {
    case '1':
        inquiry();      //查询函数
        break;
    case '2':
        transfer();        //转移,转账。
        break;
    case '3':
        change_password();  //修改密码
        break;
    case '4':
        cunkuan();       //存款函数
        break;
    case '5':

        qukuan();            //取款函数
        break;
    case '6':

        quit();     //退出
        break;
    default:
        printf("输入有误,请重新输入");
        menu();
    }
}
 

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 猫叔压力大 2021-04-17 11:40
    已采纳
    if ((fp = (fopen("a1.txt", "b")) == NULL)) 

    改一下

    if ((fpm = fopen("a1.txt", "r")) == NULL)

    ==的优先级比=高一些, ==得到的结果是Bool,没法赋值给File*

     

    【望采纳,谢谢】

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • 调试时一直发断点是什么意思?你用的是什么开发工具呢?

    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-04-19 11:17

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-04-20 13:59

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题