user-0 提问: 第一次在这发帖，有循环结构的问题，求解释，急！！

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 在Dedug后，我发现了原来问题在  if(strcmp(users[i].mageraccount," ")==0) 上，users[i].mageraccount不应该与空格字符相等，而是应该 写成  if(strcmp(users[i].mageraccount,"")==0) ，这样循环问题就解决了，可是出现了新的问题，不过，还是谢谢大家给我解答。

user: user-0
content: 引用 16 楼 ysmz555 的回复:fread()函数用于读取实型，整型等数据块，读结构型中的字符串成员会出现一定的乱码。你用fgets()函数读就能正常。 用fread也可以读字符型的吧，之前我用fread读字符型的学生姓名时，也出现了乱码，后来问老师才知道，应该把结构体中的字符型学生姓名定义为字符数组，而不是字符指针，定义为字符指针时，在读取文件时，系统不知道指针的具体内存大小，所以会出现乱码，但定义为数组，就必须要指定数组的大小，也就是说在读取文件时，系统可以知道数组的内存大小，就不会出现乱码了；感觉在读取结构体数据时，用fgets不太好用

user: user-2
content: 怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。

user: user-3
content: 在调试下运行，出错了点中断，通过调用堆栈定位到出错位置，观察分析原因

user: user-4
content: 看不清代码？

user: user-5
content: fread()函数用于读取实型，整型等数据块，读结构型中的字符串成员会出现一定的乱码。你用fgets()函数读就能正常。

user: user-0
content: 引用 12 楼 grtorange 的回复:我怀疑是两点：  1.fread语句后面少了逗号； 2.fread(&users[i],sizeof(User),1,fp)是不是应该改成fread(&users[i], 1, sizeof(User), fp) 我学的是把1放在前面的。 1.分号；加上去也会有同样的问题； 2.但我学的是 1 放后面，我想是都可以的，因为编译器没有报错，那就是都可以的，语法上没有问题，关键就是逻辑思路上的问题

user: user-0
content: 引用 11 楼 ysmz555 的回复:你登录是要输入帐号的，也就是与你从文件中读出来的数据对比，如果对上了就停止循环，关闭文件是不？可每读一次文件数据存放到users中，再用strcmp函数比较users中的mageraccount 成员是否为空，如果空则结束。帐号是空格字符？有点不明白。 我试着按照你的思路去写，但依然出现了同样的问题，代码在下面； void magerlogin() {     char ac[20];     char pw[20];     int i=0;     int f;     system("cls");     printf("             登录\n");     printf("------------------------------\n");     printf("    账号：");     scanf("%s",ac);     printf("    密码：");     scanf("%s",pw);     printf("------------------------------\n");      FILE*fp=fopen("userdata.dat","rb+");     //for(i=0; i<100; i++)     while(1)     {          fread(&users[i],sizeof(User),1,fp);//userdata.dat里有数据；         if(strcmp(users[i].mageraccount,ac)==0)//users[i].mageraccount已定义；         {             if(strcmp(users[i].magerpassword,pw)==0)                 break;             else             {                 getchar();                 printf("密码输入错误!!请重新输入\n\n");                 printf("0.返回主菜单  1.返回输入\n\n");                 printf("请选择序号：");                 scanf("%d",&f);                 if(f==0)                     vice_main();                 if(f==1)                     magerlogin();                 //getchar();              }         }          else if(strcmp(users[i].mageraccount," ")==0)                 //else if(users[i].mageraccount==0)             {                 getchar();                 printf("   账号不存在!!请重新输入\n\n");                 printf("0.返回主菜单  1.返回输入\n\n");                 printf("请选择序号：");                 scanf("%d",&f);                 if(f==0)                     vice_main();                 if(f==1)                     magerlogin();              }             else             {                 i++;                 continue;             }      }         fclose(fp);

user: user-0
content: 引用 11 楼 ysmz555 的回复:你登录是要输入帐号的，也就是与你从文件中读出来的数据对比，如果对上了就停止循环，关闭文件是不？可每读一次文件数据存放到users中，再用strcmp函数比较users中的mageraccount 成员是否为空，如果空则结束。帐号是空格字符？有点不明白。 我的思路是先把二进制文件中的数据全部读取出来，当users[i].mageraccount与空格字符相等时，就意味着文件里已经没有已写入的数据了，这时就BREAK，然后在进行比较，我的比较函数写在后面，如下图

user: user-6
content: 我怀疑是两点：  1.fread语句后面少了逗号； 2.fread(&users[i],sizeof(User),1,fp)是不是应该改成fread(&users[i], 1, sizeof(User), fp) 我学的是把1放在前面的。

user: user-5
content: 你登录是要输入帐号的，也就是与你从文件中读出来的数据对比，如果对上了就停止循环，关闭文件是不？可每读一次文件数据存放到users中，再用strcmp函数比较users中的mageraccount 成员是否为空，如果空则结束。帐号是空格字符？有点不明白。

user: user-0
content: 引用 9 楼 ysmz555 的回复:fread(&users[i],sizeof(User),1,fp)    这条语句没加分号吧 匆忙之间忘加了，但这不是主要问题，我是出了编译器无法检测出的问题，也就是程序语法上没问题，但运行程序时会停止，如图二所示，也就是出了逻辑问题

user: user-5
content: fread(&users[i],sizeof(User),1,fp)    这条语句没加分号吧

user: user-0
content: 引用 7 楼 wang0635 的回复:[quote=引用 6 楼 qq_33819764 的回复:] [quote=引用 3 楼 wang0635 的回复:] 怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。 我也觉得是这个原因，但不懂为什么break不出来；我的 if 条件是 users[i].mageraccount 与 " " 相等时就break,也就是读到文件里 users[i].mageraccount等于空时就break ，应该可以的，不懂为什么不行，之前 换了 条件 ，改成 if (0== fread(&users[i],sizeof(User),1,fp)),就break ,但也不行，换了 很多条件都不行， 将 mageraccount 改成了 Int 型，条件改成 if (users[i].mageraccount==0),就break，也不行，很多方法都试过了，不行，所以来求助了(⊙v⊙)(⊙v⊙)[/quote] 要看你的userdata.dat文件中到底是怎么存的，存的什么样的内容[/quote] 使用二进制的方式存的，用记事本打开会显示乱码，我目前就存了两组数据，一个账号和密码是都625，另一个账号和密码都是123  之前我写注册的代码时也遇到了和 登录功能 类似的问题，于是我就直接把 注册 代码 用 FILE*fp=fopen("userdata.dat","ab+"); 这种形式 写了  但现在 登录 不能这样写，所以我就不懂 了

user: user-2
content: 引用 6 楼 qq_33819764 的回复:[quote=引用 3 楼 wang0635 的回复:] 怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。 我也觉得是这个原因，但不懂为什么break不出来；我的 if 条件是 users[i].mageraccount 与 " " 相等时就break,也就是读到文件里 users[i].mageraccount等于空时就break ，应该可以的，不懂为什么不行，之前 换了 条件 ，改成 if (0== fread(&users[i],sizeof(User),1,fp)),就break ,但也不行，换了 很多条件都不行， 将 mageraccount 改成了 Int 型，条件改成 if (users[i].mageraccount==0),就break，也不行，很多方法都试过了，不行，所以来求助了(⊙v⊙)(⊙v⊙)[/quote] 要看你的userdata.dat文件中到底是怎么存的，存的什么样的内容

user: user-0
content: 引用 3 楼 wang0635 的回复:怀疑： while循环中，一直没有break出来，一直往下读文件，却早已读到文件尾了，仍坚持循环读。 我也觉得是这个原因，但不懂为什么break不出来；我的 if 条件是 users[i].mageraccount 与 " " 相等时就break,也就是读到文件里 users[i].mageraccount等于空时就break ，应该可以的，不懂为什么不行，之前 换了 条件 ，改成 if (0== fread(&users[i],sizeof(User),1,fp)),就break ,但也不行，换了 很多条件都不行， 将 mageraccount 改成了 Int 型，条件改成 if (users[i].mageraccount==0),就break，也不行，很多方法都试过了，不行，所以来求助了(⊙v⊙)(⊙v⊙)

user: user-0
content: 引用 2 楼 paschen 的回复:在调试下运行，出错了点中断，通过调用堆栈定位到出错位置，观察分析原因 调试是指Debug吧，但不会调用堆栈(⊙v⊙)(⊙v⊙)

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:看不清代码？ void magerlogin() {     char ac[20];     char pw[20];     int i=0;     int f;     system("cls");     printf("             登录\n");     printf("------------------------------\n");     printf("    账号：");     scanf("%s",ac);     printf("    密码：");     scanf("%s",pw);     printf("------------------------------\n");      FILE*fp=fopen("userdata.dat","rb+");     while(1)     {          fread(&users[i],sizeof(User),1,fp)//userdata.dat里有数据；         if(strcmp(users[i].mageraccount," ")==0)//users[i].mageraccount已定义；             break;            i++;         }     fclose(fp);