标题:【求助】对于文件的特定数据进行更新,最后一步实现不了,求解,代码如下
只看楼主
歆歆然
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2017-11-13
结帖率:66.67%
已结贴  问题点数:13 回复次数:6 
【求助】对于文件的特定数据进行更新,最后一步实现不了,求解,代码如下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct data
{
    char account[20];
    char password[20];
    char name[20];
    float balance;
};
#define N 3
int main()
{
    int i;
    struct data st,user,user1,user2;
    char account[20],auser[20],nuser[20];
    char password[20];
    int m;
    float money;
    scanf("%s",account);
    scanf("%s",password);
    FILE *fp,*fpmaster,*fpuser;
    fp=fopen("data002.dat","rb");
    if(fp==NULL)
    {
        printf("Cannot open file strike any key exit!");
        exit(0);
    }
    for(i=0;i<3;i++)
    {
        fseek(fp,i*sizeof(struct data),SEEK_SET);
        fread(&st,sizeof(struct data),1,fp);
        if(strcmp(st.account,account)==0&&strcmp(st.password,password)==0)
        {
            printf("%s %s %s %.2f\n",st.account,st.password,st.name,st.balance);
            fpmaster=fp;
            printf("————————-\n");
            break;
        }   
    }
    printf("请输入转账用户账号:");
    scanf("%s",auser);
    printf("请输入转账用户用户名:");
    scanf("%s",nuser);
    printf("请输入转账金额: ");
    scanf("%f",&money);
    for(i=0;i<3;i++)
    {
        fseek(fp,i*sizeof(struct data),SEEK_SET);
        fread(&user,sizeof(struct data),1,fp);
        if(strcmp(user.account,auser)==0&&strcmp(user.name,nuser)==0)
        {
            user.balance+=money;
            st.balance-=money;
            printf("%s %s %s %.2f\n",user.account,user.password,user.name,user.balance);
            printf("%s %s %s %.2f\n",st.account,st.password,st.name,st.balance);
            fpuser=fp;
            printf("————————-\n");
            break;
        }   
    }
    fclose(fp);
    //更新
    fp=fopen("data002.dat","rb+");
    if(fp==NULL)
    {
        printf("Cannot open file strike any key exit!");
        exit(0);
    }
    for(i=0;i<3;i++)
    {
        fseek(fp,i*sizeof(struct data),SEEK_SET);
        fread(&user,sizeof(struct data),1,fp);
        if(strcmp(st.account,account)==0&&strcmp(st.password,password)==0)
        {
            fwrite(&st,sizeof(struct data),1,fp);
            break;
        }
    }
    for(i=0;i<3;i++)
    {
        fseek(fp,i*sizeof(struct data),SEEK_SET);
        fread(&user,sizeof(struct data),1,fp);
        if(strcmp(user.account,auser)==0&&strcmp(user.name,nuser)==0)
        {
            fwrite(&user,sizeof(struct data),1,fp);
            break;
        }
    }
    fclose(fp);
    return 0;
}
搜索更多相关主题的帖子: struct data password user printf 
2018-01-06 20:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
看不太明白,处理过程是不是这样:
1、按账号和密码查找,结果st
2、按账号和姓名查找,结果user
3、修改保存:
    user.balance += money;
    st.balance -= money;
问题:
账号、密码和姓名不是同在一条数据记录吗?也就是说查到的st与user是在同一条记录。
是的话,下面两句一加一减不是等于没变?
    user.balance += money;
    st.balance -= money;
2018-01-06 22:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
给个data002.dat文件看看
2018-01-06 22:13
歆歆然
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2017-11-13
得分:0 
回复 2楼 吹水佬
转账的用户是user,登陆的账户时st
2018-01-07 13:36
歆歆然
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2017-11-13
得分:0 
data002.zip (622 Bytes)
2018-01-07 13:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:13 
以下是引用歆歆然在2018-1-7 13:36:33的发言:

转账的用户是user,登陆的账户时st

是不是这样:

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

struct data
{
    char account[20];
    char password[20];
    char name[20];
    float balance;
};

int main()
{
    FILE *fp;
    fp = fopen("data002.dat","rb+");
    if (fp == NULL)
    {
        printf("Cannot open file strike any key exit!");
        exit(0);
    }

    char account[20], password[20];
    printf("登录\n");
    printf("请输入账号:");
    scanf("%s", account);
    printf("请输入密码:");
    scanf("%s", password);

    long offset_st = -1;
    struct data st;
    while (fread(&st,sizeof(struct data),1,fp)==1)
    {
        if (strcmp(st.account,account)==0 && strcmp(st.password,password)==0)
        {
            fseek(fp, -sizeof(struct data), SEEK_CUR);
            offset_st = ftell(fp);
            break;
        }
    }
    if (offset_st == -1)
    {
        printf("登录无效\n");
        fclose(fp);
        return 0;
    }

    char auser[20], nuser[20];
    float money;
    printf("请输入转账用户账号:");
    scanf("%s",auser);
    printf("请输入转账用户用户名:");
    scanf("%s",nuser);
    printf("请输入转账金额:");
    scanf("%f",&money);

    long offset_user = -1;
    struct data user;
    fseek(fp, 0, SEEK_SET);
    while (fread(&user,sizeof(struct data),1,fp)==1)
    {
        if (strcmp(user.account,auser)==0 && strcmp(user.name,nuser)==0)
        {
            fseek(fp, -sizeof(struct data), SEEK_CUR);
            offset_user = ftell(fp);
            break;
        }
    }
    if (offset_user == -1)
    {
        printf("转账无效\n");
        fclose(fp);
        return 0;
    }

    printf("转账前\n");
    printf("%s %s %s %.2f\n", st.account, st.password, st.name, st.balance);
    printf("%s %s %s %.2f\n", user.account, user.password, user.name, user.balance);
    printf("————————-\n");

    user.balance += money;
    st.balance -= money;
    fseek(fp, offset_st, SEEK_SET);
    fwrite(&st, sizeof(struct data), 1, fp);
    fseek(fp, offset_user, SEEK_SET);
    fwrite(&user, sizeof(struct data), 1, fp);

    printf("转账后\n");
    fseek(fp, offset_st, SEEK_SET);
    fread(&st, sizeof(struct data), 1, fp);
    fseek(fp, offset_user, SEEK_SET);
    fread(&user, sizeof(struct data), 1, fp);
    printf("%s %s %s %.2f\n", st.account, st.password, st.name, st.balance);
    printf("%s %s %s %.2f\n", user.account, user.password, user.name, user.balance);
    printf("————————-\n");

    fclose(fp);
    return 0;
}
2018-01-07 15:21
歆歆然
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2017-11-13
得分:0 
回复 6楼 吹水佬
对,谢谢
2018-01-08 08:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-484029-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.148230 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved