文件输入输出比较和显示

void registers()
{

struct  waterUser z[N];
struct  waterUser a[N];
FILE *fp,*fp1;
int sleep[1000],i=0,t;
char p;
printf("欢迎来到注册界面!\n");
sleep[1000];
fp=fopen("shuifei.txt","r");
fread(&a[N],sizeof(a[N].id),1,fp);
printf("请输入账号\n");
scanf("%d",&t);

do{



      if(t==a[i].id)
     {printf("账号正确\n");
     break;}
     i++;
}while(i>=N);
fclose(fp);
fp1=fopen("users.txt","wb");
printf("请输入密码\n");
scanf("%s",&p);
fprintf(fp1,"%s",p);
system("pause");
printf("请牢记密码\n");
fclose(fp1);

}

`
t==a[i].id
printf("账号正确\n");看不出有没有比较
printf("请牢记密码\n");此步显示不出来

代码可以进行下述修改:

  • 修改循环结构,从while循环改成了 for 循环。
  • 对于匹配账号的情况进行特判,如果i等于N就说明账号不存在。
  • 在读取密码之后,将读取的密码打印出来,方便用户记录密码。

修改后的代码如下:

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

#define N 1000

struct waterUser {
    int id;
};

void registers() {
    struct waterUser z[N];
    struct waterUser a[N];
    FILE *fp, *fp1;
    int sleep[1000], i = 0, t;
    char p[100];
    printf("欢迎来到注册界面!\n");
    sleep[1000];
    fp = fopen("shuifei.txt", "r");
    fread(&a[N], sizeof(a[N].id), 1, fp);

    printf("请输入账号: ");
    scanf("%d", &t);
    for (i = 0; i < N; i++) {
        if (t == a[i].id) {
            printf("账号正确\n");
            break;
        }
    }
    if (i == N) {
        printf("账号不存在\n");
    }
    fclose(fp);

    printf("请输入密码: ");
    scanf("%s", p);
    fp1 = fopen("users.txt", "wb");
    fprintf(fp1, "%s", p);
    printf("请牢记密码: %s\n", p);
    fclose(fp1);

    system("pause");
}

这个是因为使用fread的方法不适合有关系,因为文本文件如果手动输入账号,则使用fread以%d的方式来读取会出现错误的结果,改为fscanf()读取可能更适合一点;

另外如果匹配到了账户之后写入的密码,与账户对应起来也是一个需要考虑的问题,暂时以直接写入密码来实现。

修改如下:

参考链接:

#include <stdio.h>
#include <stdlib.h>
#define N 100

struct waterUser{
    int id;
}; 

void registers()
{

    struct  waterUser z[N];
    struct  waterUser a[N];
    FILE *fp,*fp1;
    int sleep[1000],i=0,t;
    char p[20]; // 存储密码的变量p改为字符数组,以存储多个字符的密码 
    printf("欢迎来到注册界面!\n");
    sleep[1000];
    fp=fopen("shuifei.txt","r");
    int j=0,id;

    while(feof(fp)==0){
            // https://baike.baidu.com/item/fscanf/10942374?fr=aladdin        
        int num=fscanf(fp,"%d",&id); // 每次读取一个整数类型的账号到临时变量id中 
        if(num!=EOF){  // 如果争取读到,则把此账号存入水费账户结构数组元素的账户id字段 
            a[j].id = id;
        //    printf("a[%d].id=%d\n",j,a[j].id);
            j++;
        }
        
    }
    fclose(fp);
    
    printf("请输入账号\n");
    scanf("%d",&t);
    int findUser=0;  // 是否找到账户的标志 
    do{
        
        if(t==a[i].id)  
         {
             findUser=1; // 如果在读取的账号中找到此账号id,则标志置1 
             printf("账号正确\n");
             break;
         }
         i++;
    }while(i<j);
    
    
    if(findUser==1){  // 如果找到账号,则进行密码设置 
        fp1=fopen("users.txt","w");
        printf("请输入密码\n");
        scanf("%s",p);
        fprintf(fp1,"%s",p);
        system("pause");
        printf("请牢记密码\n");
        fclose(fp1);
    }else{  //如果没有找到,则打印提示,然后退出程序 
        printf("没有找到账号,程序退出!\n");
        return ;
    }
    
}

int main(void){
    
    registers(); 
    
    
    return 0;
    
} 

shuifei.txt(测试文件内容):

111
222
333

img