牵风 发表于 2022-2-22 22:25:21

这个文件部分怎么写

1、隐私信息管理系统

本题要求采用结构体数组(或链表)存储数据。具体要求如下:
1) 程序执行时,首先要进行密码检测,以不让非法用户使用本程序。标准密码预先在程序中设定,程序运行时,若用户的输入密码和标准密码相同,则显示“口令正确!”并转去执行后续程序;若不相等,重新输入,3次都不相等则显示“您是非法用户!”并终止程序的执行。
2) 现在每个人在不同网站都有用户名和密码等信息,还有银行卡号及密码信息,众多的信息经常忘记,最好的方法是将这些信息用文件的形式保存起来。但是很多私密数据(特别是密码)不能明文存储,比较保险的办法是采用密文存储,即先将密码明文加密成密文后,再进行存储。加密方法自行设计,例如输入密码明文为字符1,但存储时却存储的是其密文字符a,这只要通过ASCII值加一个整数值即可实现。
3) 需要保护的数据信息包括编号,帐号位置,帐号描述,帐号名,密码等
4) 系统具体提供以下功能:
Ø 系统以菜单方式工作。开始运行程序时要进行密码验证。
Ø 信息的录入功能、浏览功能。
Ø 信息的查询功能。按帐号名查询,如输入“acm”可查出上表第2条记录。
Ø 信息的删除、修改功能。
Ø 信息存入文件。信息中的密码必须要加密后才能存入文件,建议先输入一串字符作为加密密钥,对信息中的密码加密后再进行存储,即确保存入文件中的信息里面,“密码”是加密后的字符串。
Ø 将文件中的信息导入。与信息存入文件的过程相反,将密码解密后导入。

文件部分希望既可以写入也可以输出



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct user
{
    int number;
    char position;
    char description;
    char name;
    char word;
} use;
int num=0;
int password();
void menue();
void message_insert();
void message_search();
void message_modify();
void message_delete();
void message_search_id();
void message_search_name();
void display_all();
void display_single();
void FILE_read();
void FILE_write();
int password()//密码验证
{
    int flag=1;
    char original;
    strcpy(original,"1008611");
    char user_word;
    printf("*******请输入密码***********\n");
    int i=3;
    for(i=1; i<=3; i++)
    {
      scanf("%s",user_word);
      if(i<3)
      {
            if(strcmp(user_word,original)==0)
            {
                printf("*****密码正确·,进入系统******\n");
                return 1;
                break;
            }
            else
            {
                printf("*******密码错误,请重新输入**********\n");
            }
      }

      else if(i==3)
      {
            printf("********多次输入错误,已退出系统**********\n");
            flag=0;
      }
    }
    return flag;

}
void menue()
{
    printf("*******请输入您所需功能的序号*********\n");
    printf("1.录入账号信息\n");
    printf("2.查询账号信息\n");
    printf("3.删除账号信息\n");
    printf("4.修改账号信息\n");
    printf("5.浏览当前保存的账号信息\n");
    printf("6.退出系统\n");

}
void message_insert()
{
    int i;
    char str;
    printf("***请输入编号****\n");
    scanf("%d",&use.number);
    getchar();
    printf("***请输入账号位置***\n");
    scanf("%s",use.position);
    getchar();
    printf("****请输入账号的描述****\n");
    scanf("%s",use.description);
    getchar();
    printf("*****请输入账号名*****\n");
    scanf("%s",use.name);
    getchar();
    printf("****请输入该账号密码*****\n");
    scanf("%s",str);
    getchar();
    for(i=0; i<strlen(str); i++)
      use.word=str+48;
    use.word='\0';
    num++;
}
void message_search_id()
{
    int id;
    printf("请输入您要查询的编号\n");
    scanf("%d",&id);
    int flag=0;
    int i;
    for(i=0; i<num; i++)
    {
      if(use.number==id)
      {
            display_single(i);
            flag=1;
            break;
      }
    }
    if(!flag)printf("信息查询失败\n");

}
void message_search_name()
{
    int flag=0;
    char name_use;
    printf("***请输入您要查询的账号名***\n");
    scanf("%s",name_use);
    int i;
    for(i=0; i<num; i++)
    {
      if(strcmp(name_use,use.name)==0)
      {
            display_single(i);
            flag=1;
            break;
      }
    }
    if(!flag)printf("***该账号名不存在,请重新输入***\n");
}
void message_delete()
{
    int id;
    int i;
    int flag=0;
    int k;
    char ans_2;
    printf("****请输入您要修改的编号****\n");
    scanf("%d",&id);
    for(i=0; i<num; i++)
    {
      if(use.number==id)
      {
            k=i;
            printf("****请确定您要修改的信息****\n");
            display_single(i);
            flag=1;
            break;
      }
    }
    if(!flag)printf("未找到信息\n");
    else
    {
    printf("****是否需要删除,请选择yes/no\n");
    scanf("%s",ans_2);
    if(strcmp(ans_2,"yes")==0)
    {
      for(i=k; i<num; i++)
            use=use;
    }
    }
    printf("删除成功\n");
    num--;
}
void message_modify()
{
    int num_1;
    int id;
    int i;
    int j;
    char str_word;
    printf("****请输入您要修改信息的编号****\n");
    scanf("%d",&id);
    if(id<1||id>num)
      printf("***该信息不存在***\n");
    for(j=0; j<num; j++)
    {
      if(use.number==id)
      {
            num_1=j;
            break;
      }
    }
    printf("*****您要修改的信息为*****\n");
    display_single(num_1);
    printf("请重新输入编号\n");
    scanf("%d",&use.number);
    getchar();
    printf("请重新输入账号位置\n");
    scanf("%s",use.position);
    printf("请重新输入账号描述\n");
    scanf("%s",use.description);
    getchar();
    printf("请重新输入账号名\n");
    scanf("%s",use.name);
    getchar();
    printf("请重新输入密码\n");
    scanf("%s",str_word);
    for(i=0; i<strlen(str_word); i++)
      use.word=str_word+48;

}
void message_search()
{
    int s;
    printf("本系统提供有两种查询方式\n");
    printf("1.编号查询\n");
    printf("2.账号名查询\n");
    printf("请选择查询方式\n");
    scanf("%d",&s);
    switch(s)
    {
    case 1:
      message_search_id();
      break;
    case 2:
      message_search_name();
      break;
    }
}
void display_single(int id)
{
    int i;
    char str_1;
    printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
    printf("========================================================================\n");
    for(i=0; i<strlen(use.word); i++)
      str_1=use.word-48;
    str_1.word)]='\0';
    printf("No.%-5d%-25s%-20s%-18s%-10s\n",use.number,use.position,use.description,use.name,str_1);
}
void display_all()
{
    int i,j;
    while(1)
    {
      printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
      printf("-------------------------------------------------------------------------\n");
      for(i=0; i<num; i++)
      {
            char str;
            for(j=0; j<strlen(use.word); j++)
            {
                str=use.word-48;
            }
            str.word)]='\0';
            printf("%-5d%-25s%-20s%-18s%-10s\n",use.number,use.position,
                   use.description,use.name,str);
      }
      break;
    }
}
void FILE_write()
{
    FILE *fp;
    int i;
    if((fp = fopen("exper.txt","wb"))==NULL)
    {
      return;
    }
    if(fwrite(&num, sizeof(int),1,fp) != 1)
      printf("无法写入文件\n");
    else
    {
      for(i = 0; i < num; i++)
      {
            if( fwrite(&use, sizeof(struct user),1,fp)!=1)
                printf("无法写入文件\n");
      }
    }
    fclose(fp);
}
void FILE_read()
{
    FILE *fp;
    int i;
    if((fp = fopen("exper.txt","rb"))==NULL)
    {
      return;
    }
    if(fread(&num,sizeof(int),1,fp)!=1)
      num = 1;
    else
    {
      for(i = 0; i < num; i++)
            fread(&use,sizeof(struct user),1,fp);
    }
    num = 0;
    fclose(fp);
}
int main()
{

    if(!password())
      return 0;
      int n;
    FILE_read();
    while(1)
    {
      menue();
      scanf("%d",&n);
      getchar();
      switch(n)
      {
      case 1:
            message_insert();
            break;
      case 2:
            message_search();
            break;
      case 3:
            message_delete();
            break;
      case 4:
            message_modify();
            break;
      case 5:
            display_all();
            break;
      case 6:
            return 0;
      }
       FILE_write();
    }
}

ba21 发表于 2022-2-24 13:59:12

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define USER_MAX 10000 // 程序能保存的最大用户数

struct user
{
    char number; // 编号用字符串更合理
    int position; // 信息在数组中的位置 10000 int型足够了
    char description;
    char name;
    char word;
} use={0}; // 全初始化为0
int num=0;

// 加密
void encode(char str[])
{
    int i;
    for(i=0; i<strlen(str); i++)
      str=str+48;
}

// 解密
void decode(char str[])
{
    int i;
    for(i=0; i<strlen(str); i++)
      str=str-48;
}

int password()//密码验证
{
    int flag=1;
    char original;
    strcpy(original,"1008611");
    char user_word="1008611";
    printf("*******请输入密码***********\n");
    int i=3;
    for(i=1; i<=3; i++)
    {
      // scanf("%s",user_word);
      if(i<3)
      {
            if(strcmp(user_word,original)==0)
            {
                printf("*****密码正确·,进入系统******\n");
                return 1;
                break;
            }
            else
            {
                printf("*******密码错误,请重新输入**********\n");
            }
      }

      else if(i==3)
      {
            printf("********多次输入错误,已退出系统**********\n");
            flag=0;
      }
    }
    return flag;

}
void menue()
{
    printf("*******请输入您所需功能的序号*********\n");
    printf("1.录入账号信息\n");
    printf("2.查询账号信息\n");
    printf("3.删除账号信息\n");
    printf("4.修改账号信息\n");
    printf("5.浏览当前保存的账号信息\n");
    printf("6.退出系统\n");

}
void message_insert()
{
    int i;
    char str={'\0'};

    if(num==USER_MAX-1)
    {
      printf("信息已满!");
      return;
    }


    printf("***请输入编号****\n");
    scanf("%s",&use.number);
    getchar();
    printf("****请输入账号的描述****\n");
    scanf("%s",use.description);
    getchar();
    printf("*****请输入账号名*****\n");
    scanf("%s",use.name);
    getchar();
    printf("****请输入该账号密码*****\n");
    scanf("%s",str);
    encode(str); // 加密
    strcpy(use.word, str);

    use.position = num+1;

    num++;
}

// 按编号查询出用户所在位置
int user_position(char number[])
{
    int i;

    for(i=0; i<num; i++)
    {
      if(strcmp(use.number, number)==0)
      {
            return i;
            break;
      }
    }

    return -1;
}

void message_search_number()
{
    char number={'\0'};
    int i;

    printf("请输入您要查询的编号\n");
    scanf("%s", &number);
    i = user_position(number);
    if (i==-1)
    {
      printf("未查询到编号为 %s 的信息。\n", number);
      return;
    }

    display_single(i);
}
void message_search_name()
{
    int flag=0;
    char name;
    printf("***请输入您要查询的账号名***\n");
    scanf("%s",name);
    int i;
    for(i=0; i<num; i++)
    {
      if(strcmp(name,use.name)==0)
      {
            display_single(i);
            flag=1;
      }
    }
    if(!flag)printf("未查询到帐号名为 %s 的信息。\n", name);
}
void message_delete()
{
    char number={'\0'};
    int i, k;
    char ans_2;

    if(num==0)
    {
      printf("当前已无数据。");
      return;
    }

    printf("****请输入您要删除的编号****\n");
    scanf("%s", &number);

    k = user_position(number);
    if(k==-1)
    {
      printf("未找到信息\n");
      return;
    }

    printf("****请确定您要删除的信息****\n");
    display_single(k);

    printf("****是否需要删除,请选择yes/no\n");
    scanf("%s",ans_2);
    if(strcmp(ans_2,"yes")==0)
    {
      // 最后一位,直接清0
      if(k==num-1)
      {
            memset(&use, 0, sizeof(struct user));
      }
      else // 首位和中间处理方式一样
      {
            int j; // 临时保存删除位置
            if(k==0)
            {
                j = 0;
            }
            else // 中间
            {
                j=k;
            }

            for(i=j; i<num; i++)
            {
                use=use;
                use.position=i+1;
            }
            memset(&use, 0, sizeof(struct user));
      }

      printf("删除成功\n");
      num--;
    }
}
void message_modify()
{
    char number={'\0'};
    int k;
    char str;

    if(num==0)
    {
      printf("当前已无数据。");
      return;
    }

    printf("****请输入您要修改信息的编号****\n");
    scanf("%s", &number);

    k = user_position(number);
    if(k==-1)
    {
      printf("未找到信息\n");
      return;
    }

    printf("*****您要修改的信息为*****\n");
    display_single(k);
    printf("新编号:");
    scanf("%s",&use.number);
    getchar();
    printf("新账号描述:");
    scanf("%s",use.description);
    getchar();
    printf("新账号名:");
    scanf("%s",use.name);
    getchar();
    printf("新密码:");
    scanf("%s",str);

    encode(str);
    strcpy(use.word, str);
}
void message_search()
{
    int s;
    printf("本系统提供有两种查询方式\n");
    printf("1.编号查询\n");
    printf("2.账号名查询\n");
    printf("请选择查询方式\n");
    scanf("%d",&s);
    switch(s)
    {
    case 1:
      message_search_number();
      break;
    case 2:
      message_search_name();
      break;
    }
}
void display_single(int i)
{
    char str;
    strcpy(str, use.word);
    decode(str);

    printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
    printf("========================================================================\n");

    printf("No.%-5s%-25d%-20s%-18s%-10s\n", use.number, use.position, use.description, use.name, str);
}
void display_all()
{
    int i,j;

    printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
    printf("-------------------------------------------------------------------------\n");
    for(i=0; i<num; i++)
    {
      char str={'\0'};
      strcpy(str, use.word);
      decode(str);

      printf("%-5s%-25d%-20s%-18s%-10s\n",use.number, use.position, use.description, use.name, str);
    }
}
void FILE_write()
{
    FILE *fp;
    int i;
    if((fp = fopen("exper.txt","wb"))==NULL)
    {
      return;
    }

    if(num==0)
    {
      return;
    }

    for(i=0; i<num; i++)
    {
      if( fwrite(&use, sizeof(struct user),1,fp)!=1)
            printf("无法写入文件\n");
    }

    fclose(fp);
}
void FILE_read()
{
    FILE *fp;
    if((fp = fopen("exper.txt","rb"))==NULL)
    {
      return;
    }

    num = 0; // 记录用户数量
    while(1)
    {
      if(fread(&use,sizeof(struct user),1,fp)!=1) // 读取失败退出
            break;
      num++;
    }

    fclose(fp);
}
int main()
{

    if(!password())
      return 0;

    int n;
    FILE_read();
    while(1)
    {
      menue();
      scanf("%d",&n);
      getchar();
      switch(n)
      {
      case 1:
            message_insert();
            break;
      case 2:
            message_search();
            break;
      case 3:
            message_delete();
            break;
      case 4:
            message_modify();
            break;
      case 5:
            display_all();
            break;
      case 6:
            break;
      }
      if(n==6) break;
    }

    // 退出保存
    FILE_write();
    return 0;
}

jzhjedi 发表于 2022-2-25 09:26:26

顶顶帖子{:10_279:}

小bai学c 发表于 2022-2-25 09:55:50

{:10_254:}

1molHF 发表于 2022-2-25 10:33:54

{:10_254:}

零的零次方 发表于 2022-2-26 04:58:50

{:10_337:}

hornwong 发表于 2022-2-26 19:30:04

{:5_95:}

1050293757 发表于 2022-3-26 17:45:30

{:5_109:}

零的零一方 发表于 2022-3-28 08:39:55

{:10_277:}

零的零次方 发表于 2022-3-28 08:42:41

{:10_257:}{:10_257:}{:10_257:}{:10_257:}
页: [1]
查看完整版本: 这个文件部分怎么写