永发信息网

C语言问题,为什么两个printf输出乱码呢,找不到原因,跟书上的一样啊

答案:2  悬赏:0  手机版
解决时间 2021-03-04 18:55
#include
#include
struct Student
{
long id;
char name[20];
int age;
char sex[6];
};
int main()
{
Student student;
FILE *fp1,*fp2;
fp1=fopen("d:\\1.txt","r");
if(fp1==NULL)
{
printf("Cannot open the file!");
exit(0);
}
fscanf(fp1,"%ld%s%d%s",&student.id,student.name,&student.age,student.sex);
printf("学号\t\t姓名\t年龄\t性别\n");
printf("%ld\t%s\t%d\t%s\n",student.id,student.name,student.age,student.sex);

///////////////////////////////////////问题在这里
char ch;
ch=fgetc(fp1);
printf("\n使用fgetc读取的数据:%c\n",ch);

char ch1[20];
fgets(ch1,11,fp1);
printf("\n使用fgets读取的数据:%s\n",ch1);
fclose(fp1);
///////////////////////////////////////问题在这里

fp2=fopen("d:\\2.dat","rb");
if(fp2==NULL)
{
printf("Cannot open the file!");
exit(0);
}

fread(&student,sizeof(student),1,fp2);
printf("学号\t\t姓名\t年龄\t性别\n");
printf("%ld\t%s\t%d\t%s",student.id,student.name,student.age,student.sex);
fclose(fp2);

}
e:\\1.txt文件的内容是
4534128145 zhang 18 man
最佳答案
问题原因 : 不了解文件指针的工作方式
当 fscanf(fp1,"%ld%s%d%s",&student.id,student.name,&student.age,student.sex);

运行完之后 fp1已经指着文件末尾了,因此后面没有可以输入的信息,最后导致你的输出都是问题。
如何处理这种情况?
其实你的程序应该是测试fscanf  fgetc fgets 三种方法的
那么每一次进行结束,都需要使fp1回到文件开始,最简单的方法就是关闭文件,然后再次打开即可。
修改程序如下:
#include 
#include 
struct Student
{
long id;
char name[20];
int age;
char sex[6];
};
int main()
{
Student student;
FILE *fp1,*fp2;
fp1=fopen("1.txt","r");
if(fp1==NULL)
{
printf("Cannot open the file!");
exit(0);
}
fscanf(fp1,"%ld%s%d%s",&student.id,student.name,&student.age,student.sex);
printf("学号\t\t姓名\t年龄\t性别\n");
printf("%ld\t%s\t%d\t%s\n",student.id,student.name,student.age,student.sex);
fclose(fp1);

///////////////////////////////////////问题在这里
fp1=fopen("1.txt","r");
        char ch;
ch=fgetc(fp1);
printf("\n使用fgetc读取的数据:%c\n",ch);
fclose(fp1);
fp1=fopen("1.txt","r");
char ch1[20];
fgets(ch1,11,fp1);
printf("\n使用fgets读取的数据:%s\n",ch1);
fclose(fp1);
///////////////////////////////////////问题在这里

fp2=fopen("2.dat","rb");
if(fp2==NULL)
{
printf("Cannot open the file!");
exit(0);
}

fread(&student,sizeof(student),1,fp2);
printf("学号\t\t姓名\t年龄\t性别\n");
printf("%ld\t%s\t%d\t%s",student.id,student.name,student.age,student.sex);
fclose(fp2);

} 哦我为了方便调试,把文件地址修改了一下,你自己改回去就可以了
全部回答
其实我也遇到了,如果不是在定义数组的时候边定义边赋值,而是在后面对单个元素赋值,其它未被赋值的元素不会自动置0,而是乱码。解决办法是只输出被赋值部分,使用for循环输出。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
梦幻西游手游双平台有几个服务器
孩子已停学半年,现在想再读,学校有权拒收吗
华晶口腔门诊部怎么去啊,有知道地址的么
阿珍水果怎么去啊,有知道地址的么
海之音汽车音响我想知道这个在什么地方
重庆观音桥梦龙在哪里
三亚 到 北海 怎么走?
研究人员对分别取自4种不同的生物的部分细胞
活期宝估算未付收益和累计收益有什么区别?
联通手机老是制定不上会员业务怎么弄
炫舞时代把服装给我发给我,女生,都是点卷买
御品轩中西餐厅(台山第一总店)这个地址在什么
阳光缝纫机批发商行在哪里啊,我有事要去这个
x 80%x=99 解方程怎么???
火车票买错了日期如何改签日期
推荐资讯
表示什么的话叫什么言
请问,现在福建宁德屏南那里的结婚习俗,取个
田全线在哪里啊,我有事要去这个地方
范县濮阳范县国家税务局工会委员会地址是什么
黄应林地址在哪,我要去那里办事
橡胶绝缘的科学原理?
软中华批发多少钱
请问自考环境工程是特别难吗?
在南京买了一只叫花鸡,裹了一层泥的那种,问
下列几组通商口岸,按开放的先后顺序排列正确
同一物相多晶x射线衍射谱中,衍射线条强度不
选购家电时机身上带有什么颜色的节字表明该产
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?