void all_caculate_rank(int n) { struct student_information st[100]; int i,j,temp,count=0; FILE *fp; fp=fopen("学生信息.txt","r"); if(fp==NULL) { printf("打开文件失败!\n"); getch(); exit(0); } for(i=0;i<n;i++){ count = fscanf(fp,"%s\t%s\t%s\t%c\t%s\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n",st[i].id,st[i].name,st[i].major,&st[i].graduate,st[i].birthday,&st[i].gaoshu,&st[i].lisan,&st[i].luoji,&st[i].gpa_gaoshu,&st[i].gpa_lisan,&st[i].gpa_luoji,&st[i].gpa,&st[i].rank); if(count != 13){ // 检查读取文件时的错误 printf("读取文件失败!\n"); printf("%d",count); getch(); exit(0); } } fclose(fp); //计算排名并存储 for(i=0;i<n;i++) { temp=1;//第1名 for(j=0;j<n;j++){ if(st[i].gpa<st[j].gpa) temp++;//如果较小,排名下降1名 } st[i].rank=temp; } //更新记录 fp=fopen("全部排名后学生信息.txt","w"); for(i=0;i<n;i++) { fprintf(fp,"%s\t%s\t%s\t%c\t%s\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n",st[i].id,st[i].name,st[i].major,st[i].graduate,st[i].birthday,st[i].gaoshu,st[i].lisan,st[i].luoji,st[i].gpa_gaoshu,st[i].gpa_lisan,st[i].gpa_luoji,st[i].gpa,st[i].rank); } fclose(fp); printf("数据重新计算成功\n"); getch(); }为啥count =-1运行后
时间: 2024-03-07 19:50:18 浏览: 85
caculate_1.rar_caculate_1_labview 计算器_labview 计算器_labview计算器_计算
在读取文件时,如果文件已经到达末尾,那么 `fscanf` 函数会返回 -1,表示没有读取到任何数据。因此,在读取文件时,如果 `count` 的值等于 -1,那么就意味着文件已经读取完毕,没有更多的数据可以读取了。在这种情况下,程序应该停止读取文件,不需要进行错误处理。可以在读取文件前先判断文件是否为空,如果为空则不进行读取,而是直接返回。可以按如下方式修改代码:
```c
fp = fopen("学生信息.txt", "r");
if (fp == NULL) {
printf("打开文件失败!\n");
getch();
exit(0);
}
// 判断文件是否为空
if (fscanf(fp, "%*[^\n]") == EOF) {
printf("文件为空!\n");
getch();
exit(0);
}
// 指针回到文件开头
rewind(fp);
for (i = 0; i < n; i++) {
count = fscanf(fp, "%s\t%s\t%s\t%c\t%s\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n", st[i].id, st[i].name, st[i].major, &st[i].graduate, st[i].birthday, &st[i].gaoshu, &st[i].lisan, &st[i].luoji, &st[i].gpa_gaoshu, &st[i].gpa_lisan, &st[i].gpa_luoji, &st[i].gpa, &st[i].rank);
// 如果读到文件末尾,直接退出循环
if (count == EOF) {
break;
}
if (count != 13) {
printf("读取文件失败!\n");
printf("%d", count);
getch();
exit(0);
}
}
fclose(fp);
```
这样做的好处是可以避免程序在读取空文件时出现错误,同时也可以在读取到文件末尾时停止读取,避免程序无限循环。
阅读全文