C语言问题,为什么两个printf输出乱码呢,找不到原因,跟书上的一样啊
解决时间 2021-03-04 18:55
- 提问者网友:未信
- 2021-03-04 10:05
#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
最佳答案
- 五星知识达人网友:归鹤鸣
- 2021-03-04 10:36
问题原因 : 不了解文件指针的工作方式
当 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);
} 哦我为了方便调试,把文件地址修改了一下,你自己改回去就可以了
全部回答
- 1楼网友:春色三分
- 2021-03-04 11:57
其实我也遇到了,如果不是在定义数组的时候边定义边赋值,而是在后面对单个元素赋值,其它未被赋值的元素不会自动置0,而是乱码。解决办法是只输出被赋值部分,使用for循环输出。
我要举报
大家都在看
推荐资讯