有只熊463 2022-12-20 23:36 采纳率: 85.3%
浏览 32
已结题

c语言文件操作,如何修改?

使用文件操作编程实现:实现一个简单的注册功能。要求能通过键盘键入要注册的用户名和密码,并分别把用户名和密码保存在C盘根目录下的User.txt和PSW.txt中。可附加完成修改密码功能。

怎么修改我才能打开文件,一直不能打开,也在也在c盘里建了PSW.txt和User.txt了,是方法有错误吗

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//注册
void register_user()
{
char name[20];
char psw[20];
printf("请输入要注册的用户名:");
scanf("%s",name);
printf("请输入要注册的密码:");
scanf("%s",psw);
//将用户名保存到User.txt文件中
FILE *fp1 = fopen("C:\\User.txt","a+");
if(fp1 == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
fprintf(fp1,"%s\n",name);
fclose(fp1);
//将密码保存到PSW.txt文件中
FILE *fp2 = fopen("C:\\PSW.txt","a+");
if(fp2 == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
fprintf(fp2,"%s\n",psw);
fclose(fp2);
printf("注册成功!\n");
}
//修改密码
void modify_psw()
{
char name[20];
char psw[20];
char temp[20];
int i;
printf("请输入要修改密码的用户名:");
scanf("%s",name);
//从User.txt文件中获取用户名
FILE *fp1 = fopen("C:\\User.txt","r");
if(fp1 == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
i = 0;
while(fscanf(fp1,"%s",temp) != EOF)
{
if(strcmp(temp,name) == 0)
{
break;
}
i++;
}
fclose(fp1);
if(i == 0)
{
printf("没有此用户!\n");
return;
}
printf("请输入新密码:");
scanf("%s",psw);
//从PSW.txt文件中修改密码
FILE *fp2 = fopen("C:\\PSW.txt","r+");
if(fp2 == NULL)
{
printf("文件打开失败!\n");
exit(0);
}
for(int j = 0; j < i; j++)
{
fscanf(fp2,"%s",temp);
}
fseek(fp2,-strlen(temp),SEEK_CUR);
fprintf(fp2,"%s",psw);
fclose(fp2);
printf("修改成功!\n");
}
int main()
{
int choice;
while(1)
{
printf("1.注册\n");
printf("2.修改密码\n");
printf("0.退出\n");
printf("请选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
register_user();
break;
case 2:
modify_psw();
break;
case 0:
return 0;
default:
printf("输入错误!\n");
break;
}
}
return 0;
}

  • 写回答

1条回答 默认 最新

  • a5156520 2022-12-21 10:17
    关注

    应该是因为运行程序的权限不够在c盘新建文件,所以报错了,在命令行模式运行程序时,可以先用管理员的权限打开命令行,再运行程序;

    然后第二个修改程序的密码时,判断逻辑有点问题,i++应该放在正确匹配密码的if里面;

    然后是文件模式的选择,如果存入多个账号和密码,那么用户名和密码的匹配的处理逻辑需要另外设计,这里简单的默认只存入一个账号密码,所以文件模式改为写模式即可。

    修改如下:

    参考链接:
    C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析_哆啦@熊的博客-CSDN博客_c语言用rw+的方式写入会覆盖原始数据么

    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //注册
    void register_user()
    {
        char name[20];
        char psw[20];
        printf("请输入要注册的用户名:");
        scanf("%s",name);
        printf("请输入要注册的密码:");
        scanf("%s",psw);
        //将用户名保存到User.txt文件中
        FILE *fp1 = fopen("C:\\User.txt","w");
        if(fp1 == NULL)
        {
            printf("文件打开失败!\n");
            exit(0);
        }
        fprintf(fp1,"%s\n",name);
        fclose(fp1);
        //将密码保存到PSW.txt文件中
        FILE *fp2 = fopen("C:\\PSW.txt","w");
        if(fp2 == NULL)
        {
            printf("文件打开失败!\n");
            exit(0);
        }
        fprintf(fp2,"%s\n",psw);
        fclose(fp2);
        printf("注册成功!\n");
    }
    //修改密码
    void modify_psw()
    {
        char name[20];
        char psw[20];
        char temp[20];
        int i;
        printf("请输入要修改密码的用户名:");
        scanf("%s",name);
        //从User.txt文件中获取用户名
        FILE *fp1 = fopen("C:\\User.txt","r");
        if(fp1 == NULL)
        {
            printf("文件打开失败!\n");
            exit(0);
        }
        i = 0;
        while(fscanf(fp1,"%s",temp) != EOF)
        {
        //    printf("temp=%s\n",temp);
            if(strcmp(temp,name) == 0)
            {
            //    printf("in strcmp,temp=%s,name=%s\n",temp,name);
                i++;
                break;
            }
            
        }
        fclose(fp1);
        if(i == 0)
        {
            printf("没有此用户!\n");
            return;
        }
        printf("请输入新密码:");
        scanf("%s",psw);
        //从PSW.txt文件中修改密码
        FILE *fp2 = fopen("C:\\PSW.txt","r+");
        if(fp2 == NULL)
        {
            printf("文件打开失败!\n");
            exit(0);
        }
        for(int j = 0; j < i; j++)
        {
            fscanf(fp2,"%s",temp);
        }
        fseek(fp2,-strlen(temp),SEEK_CUR);
        fprintf(fp2,"%s",psw);
        fclose(fp2);
        printf("修改成功!\n");
    }
    int main()
    {
        int choice;
        while(1)
        {
        printf("1.注册\n");
        printf("2.修改密码\n");
        printf("0.退出\n");
        printf("请选择:");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
        register_user();
        break;
        case 2:
        modify_psw();
        break;
        case 0:
        return 0;
        default:
        printf("输入错误!\n");
        break;
        }
        }
        return 0;
    }
    
    

    img

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 R语言单细胞测序 对seurat对象进行标准化时出现问题
  • ¥15 Anaconda navigator updateor一直更新
  • ¥15 请问如何在matlab里使用raven工具?
  • ¥100 关于ios手游充值到一定金额,再点充值提示公众号的问题。
  • ¥15 求一个stm32串口控制程序
  • ¥20 Windows 驱动开发版本疑问相关
  • ¥15 MAC 未能打开磁盘映像
  • ¥15 fastcap使用,二维导体输入问题
  • ¥15 hosts修改后不能访问
  • ¥15 关于化学反应速率C++编译问题/FLUENT