查找错误void alter() { FILE *fp; int i; if((fp=fopen("stu.dat","wb"))==NULL) { printf("can't open file\n"); return; } for(i=0;i<Element;i++) { if(fwrite (&student[i],Elementof(struct Student_type),1,fp)!=1) printf("file write error\n"); fclose(fp); } }
时间: 2024-04-26 10:24:28 浏览: 50
在该函数中,fclose(fp)应该放在for循环的外部,否则在第一次循环时就会关闭文件指针,导致后续的写操作失败。修改后的代码如下:
void alter() {
FILE *fp;
int i;
if((fp=fopen("stu.dat","wb"))==NULL) {
printf("can't open file\n");
return;
}
for(i=0;i<Element;i++) {
if(fwrite(&student[i],sizeof(struct Student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
相关问题
改进以下程序:#include <stdio.h> #include <stdlib.h> #define Element 6 struct Student_type { char name[8]; char id[12]; int sex; int age; float total_gpa; }student[Element]; void alter() { FILE *fp; int i; if((fp=fopen("stu.dat","wb"))==NULL) { printf("can't open file\n"); return; } for(i=0;i<Element;i++) { if(fwrite (&student[i],sizeof(struct Student_type),1,fp)!=1) printf("file write error\n"); fclose(fp); } } int downup() { FILE *fp; int i,j,n; int temp ; if ((fp = fopen("students.dat", "rb+")) == NULL) { printf("Can't open file!\n"); return; } n = fread(student, sizeof(student), 100, fp); fclose(fp); for(i=0;i<n-1;i++) { for(j=0;j=n-i-1;j++) { if(student[j].id > student[j+1].id) { student temp = student[j]; student[j] = student[j+1]; student[j+1] = temp; } } } if ((fp = fopen("students.dat", "wb+")) == NULL) { printf("Can't open file!\n"); return; } fwrite(student, sizeof(student), n, fp); fclose(fp); } int main() { int i; printf(""); for(i=0;i<Element;i++) { scanf("%s%s%d%d%f",student[i].name,student[i].id,&student[i].sex,&student[i].age,&student[i].total_gpa); } alter(); return 0; }
以下是对程序的改进:
1. 修改文件名
在函数 downup() 中,文件名应该与函数 alter() 中的文件名保持一致,即 "stu.dat",而不是 "students.dat"。
2. 修改排序算法
在函数 downup() 中,冒泡排序的 j 循环条件应该是 j<n-i-1,而不是 j=n-i-1。同时,比较学生 ID 的方式应该使用 strcmp() 函数,而不是 > 运算符。
3. 修改结构体名称
在函数 alter() 中,结构体 Student_type 应该改为 Student,以便与主函数中的结构体名称保持一致。
4. 修改 fwrite() 和 fread() 函数的参数
在函数 alter() 中,应该在 fwrite() 函数中使用 &student[i],而不是 student[i],以便正确地写入每个学生的信息。
在函数 downup() 中,应该将 fread() 函数中的第三个参数改为 Element,以便正确地读取每个学生的信息。
改进后的程序如下所示:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Element 6
struct Student {
char name[8];
char id[12];
int sex;
int age;
float total_gpa;
} student[Element];
void alter() {
FILE *fp;
int i;
if((fp = fopen("stu.dat", "wb")) == NULL) {
printf("Can't open file\n");
return;
}
for(i = 0; i < Element; i++) {
if(fwrite(&student[i], sizeof(struct Student), 1, fp) != 1)
printf("file write error\n");
}
fclose(fp);
}
void downup() {
FILE *fp;
int i, j, n;
struct Student temp;
if ((fp = fopen("stu.dat", "rb+")) == NULL) {
printf("Can't open file!\n");
return;
}
n = fread(student, sizeof(struct Student), Element, fp);
fclose(fp);
for(i = 0; i < n-1; i++) {
for(j = 0; j < n-i-1; j++) {
if(strcmp(student[j].id, student[j+1].id) > 0) {
temp = student[j];
student[j] = student[j+1];
student[j+1] = temp;
}
}
}
if ((fp = fopen("stu.dat", "wb+")) == NULL) {
printf("Can't open file!\n");
return;
}
fwrite(student, sizeof(struct Student), n, fp);
fclose(fp);
}
int main() {
int i;
printf("");
for(i = 0; i < Element; i++) {
scanf("%s%s%d%d%f", student[i].name, student[i].id, &student[i].sex, &student[i].age, &student[i].total_gpa);
}
alter();
downup();
return 0;
}
```
阅读全文