C语言读取储存文件出现乱码怎么办,哪里有问题

代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<string.h>
struct Manager
{
char ID[12];
char password[20];
char name[30];
char address[100];
char email[100];
};
int main()

{

char m_email1[100];
char m_email2[100];
char iddd[12];
printf("\n-------------------------------\n");
printf("Thanks for logging in earlier\n");
printf("please enter your ID again:\n");
printf("ID: \n");
scanf("%s",iddd);
do{

 printf("Please enter your new email:\n");
 scanf("%s",m_email1);  
printf("Please enter again:\n");
 scanf("%s",m_email2); 
if(strcmp(m_email1,m_email2)==0)
 {
     printf(" Change password successfully, please remember it!\n");

FILE*nfp;
int flag=0,row=0,count=0;
int i,j;

FILE*mfp;
 mfp=fopen("manager.txt","r");    
if(mfp==NULL)
{
   printf("The manager.txt open failed.\n");
   exit(EXIT_FAILURE);
}
while(!feof(mfp))
{
 flag=fgetc(mfp);
 if(flag=='\n')
 count++;
} 
row=count+1;//ÒòΪ×îºóÒ»ÐÐûÓл»Ðзû\n,ËùÒÔÐèÒªÔÚcountºó²¹¼Ó1 
struct Manager rinfo[row];
do
{
    for (i = 0; i <row; i++)
    fscanf(mfp,"%s %s %s %s %s",rinfo[i].ID,rinfo[i].name,rinfo[i].address,rinfo[i].password,rinfo[i].email);
 }while(strcmp(rinfo[i].ID,iddd)==0);


    while (!feof(mfp))
{
        for (j = 0; j <row; j++)
    fscanf(mfp,"%s %s %s %s %s",rinfo[j].ID,rinfo[j].name,rinfo[j].address,rinfo[j].password,rinfo[j].email);
 }
  strcpy(rinfo[i].ID,m_email1);
  fclose(mfp);
 


 
nfp = fopen("manager.txt", "w");
if (nfp == NULL)
{
    printf("sorry");
    exit(EXIT_FAILURE);

}

for (i = 0; i < 10; i++)
{
    fprintf(nfp,"%s %s %s %s %s\n",rinfo[i].ID,rinfo[i].name,rinfo[i].address,rinfo[i].password,rinfo[i].email);
    
}
fclose(nfp);
printf("Okk!\n");
break;

}
else if(strcmp(m_email1,m_email2)!=0)
{
printf("The passwords are different. Enter again.");

 }

}while(1);
return 0;
}

img


原来的文件

img

img

img


最后生成的文件成了乱码

你这两段do...while后while没看懂你想干什么
do...while中是个for循环,你觉得你的do...while有什么作用吗?
用了while循环,那么循环里面的for循环就不能用了,去掉。在循环外定义个i变量,while中每读取一条记录,i++就可以了

第27行代码struct Manager rinfo[row];这能运行时定义吗?我觉得应该动态申请内存。new完delete吧!

你只输入了3个参数,输出给文件一大堆,不乱才稀奇了
敢不敢设置个断点,敢不敢把执行的每一步print出来
程序在你手里,编译器也在你手里,你要调试代码运行的过程,不要老觉得它是个黑箱