user-0 提问: 用C的文件操作能做出登录系统吗

回复:
user: user-1
content: 为什么不贴出完整的代码呢？

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:fwrite和fread是二进制形式的读写，所以你看到文件内容有部分是乱码；比如，用户名是32个字节的字符数组，你输入了“hello"5个有效字符作为用户名，fwrite写入时是写入32个字节，那么后面26（32 - 5 - 1)个字节也是要写入的，若后面的26个字节是随机值，那么写入的数据就可能是乱码了。所以，用fwrite写入的，就要用同样的格式用fread读取，这样保证读到的数据和写入的一致。 按你的意思，即使在读写数据的时候清除缓冲区也没有用啊。因为fread（）fwrite（）的参数表里就是按照数据块的大小而读（写）入的，并没有也不能检查数据块的数据是否已写满啊。。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复://注册的情况： int user_register(FILE * fp1,struct user*current_user) {     int i,L;     char repassword[13];     printf("请输入用户名:");fflush(stdout);     scanf("%s",current_user->name);     while (1) {         printf("请输入注册密码:");fflush(stdout);         scanf("%s",current_user->password);         printf("请再次输入注册密码:");fflush(stdout);         scanf("%s",repassword);         if(!two_password_valid(current_user->password,repassword))         {             printf("\n两次输入的密码不一致!请重新输入！\n");         } else break;     }     L=strlen(current_user->password);     for (i=0;i<L;i++) current_user->password[i]^=0xa5;     if(fwrite(current_user,sizeof(struct user),1,fp1)!=1){         printf ("file write error\n");     }     return 1; } //登录的情况： int online_user(FILE *fp1,struct user our_users[],struct user *current_user) {     int i,L;      for(i=0;i<N;i++){         if(fread(&our_users[i],sizeof(struct user),1,fp1)!=1)             printf ("file read error\n");     }     printf("请输入您的用户名: ");fflush(stdout);     scanf("%s",current_user->name);     printf("请输入您的密码: ");fflush(stdout);     scanf("%s",current_user->password);     L=strlen(current_user->password);     for (i=0;i<L;i++) current_user->password[i]^=0xa5;     for(i=0;i<N;i++){         if((strcmp(current_user->name,our_users[i].name)==0)&&(strcmp(current_user->password,our_users[i].password)==0))         {             return 1;         }     }     return 0; }   你的意思是要清除随机数的写（读）入吗？可运行的时候登录啊还是修改密码什么的都会显示“”file write error！“” 我觉得应该是往二进制文件预存的数据有问题，如果有这种可能的话，预存数据的时候真的要自己数好格子？。。

user: user-1
content: //注册的情况： int user_register(FILE * fp1,struct user*current_user) {     int i,L;     char repassword[13];     printf("请输入用户名:");fflush(stdout);     scanf("%s",current_user->name);     while (1) {         printf("请输入注册密码:");fflush(stdout);         scanf("%s",current_user->password);         printf("请再次输入注册密码:");fflush(stdout);         scanf("%s",repassword);         if(!two_password_valid(current_user->password,repassword))         {             printf("\n两次输入的密码不一致!请重新输入！\n");         } else break;     }     L=strlen(current_user->password);     for (i=0;i<L;i++) current_user->password[i]^=0xa5;     if(fwrite(current_user,sizeof(struct user),1,fp1)!=1){         printf ("file write error\n");     }     return 1; } //登录的情况： int online_user(FILE *fp1,struct user our_users[],struct user *current_user) {     int i,L;      for(i=0;i<N;i++){         if(fread(&our_users[i],sizeof(struct user),1,fp1)!=1)             printf ("file read error\n");     }     printf("请输入您的用户名: ");fflush(stdout);     scanf("%s",current_user->name);     printf("请输入您的密码: ");fflush(stdout);     scanf("%s",current_user->password);     L=strlen(current_user->password);     for (i=0;i<L;i++) current_user->password[i]^=0xa5;     for(i=0;i<N;i++){         if((strcmp(current_user->name,our_users[i].name)==0)&&(strcmp(current_user->password,our_users[i].password)==0))         {             return 1;         }     }     return 0; }

user: user-2
content: fwrite和fread是二进制形式的读写，所以你看到文件内容有部分是乱码；比如，用户名是32个字节的字符数组，你输入了“hello"5个有效字符作为用户名，fwrite写入时是写入32个字节，那么后面26（32 - 5 - 1)个字节也是要写入的，若后面的26个字节是随机值，那么写入的数据就可能是乱码了。所以，用fwrite写入的，就要用同样的格式用fread读取，这样保证读到的数据和写入的一致。