{ printf("Can not open file\n"); Save(); } while(!feof(fp))
时间: 2024-05-17 11:13:07 浏览: 111
这段代码中的循环是用来读取文件内容的,判断文件是否已经读取到结尾的方法是使用feof函数。但是使用feof函数可能会有一些问题,因为它在读取到结尾之前不会返回真值,而是在尝试读取下一个字符时才返回真值。因此,在使用feof函数时,需要注意循环的结束条件,否则可能会导致死循环。建议使用fread函数来读取文件内容,并且在读取到文件结尾时返回值可以作为循环的结束条件。
相关问题
修改这段代码 void in() { int i, m = 0; char ch[2]; FILE* fp; if ((fp = fopen("d:/学生系统/student.txt", "ab+")) == NULL) { printf("can not open\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) m++; } fclose(fp); if (m == 0) printf("No record!\n"); else { system("cls"); show(); } if ((fp = fopen("d:/学生系统/student.txt", "wb")) == NULL) { printf("can not open\n"); return; } for (i = 0; i < m; i++) fwrite(&stu[i], LEN, 1, fp); printf("please input(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%d", &stu[m].num); for (i = 0; i < m; i++) if (stu[i].num == stu[m].num) { printf("学号已存在!"); _getch(); fclose(fp); return; } printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", stu[m].sex); printf("出生年:"); scanf("%d", &stu[m].year); printf("出生月:"); scanf("%d", &stu[m].month); printf("出生日:"); scanf("%d", &stu[m].day); printf("c语言:"); scanf("%f", &stu[m].C); printf("高数:"); scanf("%f", &stu[m].math); printf("大学物理:"); scanf("%f", &stu[m].physics); stu[m].sum = stu[m].C + stu[m].math + stu[m].physics; stu[m].avg = stu[m].sum / 3; if (fwrite(&stu[m], LEN, 1, fp) != 1) { printf("can not save!"); _getch(); } else { printf("%s saved!\n", stu[m].name); m++; } printf("continue?(y/n):"); scanf("%s", ch); } fclose(fp); printf("OK!\n"); }
void in() {
int i, m = 0;
char ch[2];
FILE* fp;
if ((fp = fopen("d:/学生系统/student.txt", "ab+")) == NULL) {
printf("can not open\n");
return;
}
while (fread(&stu[m], LEN, 1, fp) == 1) {
m++;
}
fclose(fp);
if (m == 0) {
printf("No record!\n");
}
else {
system("cls");
show();
}
if ((fp = fopen("d:/学生系统/student.txt", "ab")) == NULL) {
printf("can not open\n");
return;
}
printf("please input(y/n):");
scanf("%s", ch);
while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) {
printf("学号:");
scanf("%d", &stu[m].num);
for (i = 0; i < m; i++) {
if (stu[i].num == stu[m].num) {
printf("学号已存在!");
_getch();
fclose(fp);
return;
}
}
printf("姓名:");
scanf("%s", stu[m].name);
printf("性别:");
scanf("%s", stu[m].sex);
printf("出生年:");
scanf("%d", &stu[m].year);
printf("出生月:");
scanf("%d", &stu[m].month);
printf("出生日:");
scanf("%d", &stu[m].day);
printf("c语言:");
scanf("%f", &stu[m].C);
printf("高数:");
scanf("%f", &stu[m].math);
printf("大学物理:");
scanf("%f", &stu[m].physics);
stu[m].sum = stu[m].C + stu[m].math + stu[m].physics;
stu[m].avg = stu[m].sum / 3;
if (fwrite(&stu[m], LEN, 1, fp) != 1) {
printf("can not save!");
_getch();
}
else {
printf("%s saved!\n", stu[m].name);
m++;
}
printf("continue?(y/n):");
scanf("%s", ch);
}
fclose(fp);
printf("OK!\n");
}
修改说明:
1. 删除了 while (!feof(fp)) 循环,因为这种方式会导致最后一个数据重复读入。
2. 修改了打开文件的方式,将 "wb" 修改为 "ab",这样可以在文件末尾添加数据。
3. 将读取文件和写入文件的操作分开,避免因为文件指针位置不正确而导致的错误。
4. 修改了文件指针的关闭方式,在函数的各个分支中都关闭了文件指针,避免了文件指针未关闭的风险。
修改这段代码的错误 void in() { int i, m = 0; char ch[2]; FILE* fp; if ((fp = fopen("d:/学生系统/student.txt", "ab+")) == NULL) { printf("can not open\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) m++; } fclose(fp); if (m == 0) printf("No record!\n"); else { system("cls"); show(); } if ((fp = fopen("d:/学生系统/student.txt", "wb")) == NULL) { printf("can not open\n"); return; } for (i = 0; i < m; i++) fwrite(&stu[i], LEN, 1, fp); printf("please input(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%d", &stu[m].num); for (i = 0; i < m; i++) if (stu[i].num == stu[m].num) { printf("学号已存在!"); _getch(); fclose(fp); return; } printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", stu[m].sex); printf("出生年:"); scanf("%d", &stu[m].year); printf("出生月:"); scanf("%d", &stu[m].month); printf("出生日:"); scanf("%d", &stu[m].day); printf("c语言:"); scanf("%f", &stu[m].C); printf("高数:"); scanf("%f", &stu[m].math); printf("大学物理:"); scanf("%f", &stu[m].physics); stu[m].sum = stu[m].C + stu[m].math + stu[m].physics; stu[m].avg = stu[m].sum / 3; if (fwrite(&stu[m], LEN, 1, fp) != 1) { printf("can not save!"); _getch(); } else { printf("%s saved!\n", stu[m].name); m++; } printf("continue?(y/n):"); scanf("%s", ch); } fclose(fp); printf("OK!\n"); }
在该代码中,有一个函数 void in(),其中有一些错误。我将一些可能的错误列在下面:
1. 函数名拼写错误,应该是 void input()。
2. 在打开文件时,应该使用 "wb+" 而不是 "ab+"。因为 "ab+" 只能在文件末尾添加数据,而 "wb+" 可以覆盖文件中的内容。
3. 在读取文件时,应该使用 feof(fp) 判断文件是否结束,而不是 while (!feof(fp))。
4. 写入文件时,应该先关闭文件再重新打开,否则写入会失败。可以将写入操作放在 while 循环外面。
5. 在输入学生信息时,应该先检查该学号是否已经存在。可以用一个 for 循环遍历数组 stu,如果找到了相同的学号,就输出错误信息并直接返回。
6. 在输入学生信息时,应该给 scanf 函数添加格式控制符,否则输入错误的类型会导致程序崩溃。
下面是修改后的代码:
void input() {
int i, m = 0;
char ch[2];
FILE* fp;
if ((fp = fopen("d:/学生系统/student.txt", "wb+")) == NULL) {
printf("can not open\n");
return;
}
while (fread(&stu[m], LEN, 1, fp) == 1) {
m++;
}
fclose(fp);
if (m == 0) {
printf("No record!\n");
} else {
system("cls");
show();
}
if ((fp = fopen("d:/学生系统/student.txt", "wb+")) == NULL) {
printf("can not open\n");
return;
}
for (i = 0; i < m; i++) {
fwrite(&stu[i], LEN, 1, fp);
}
printf("please input(y/n):");
scanf("%s", ch);
while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) {
printf("学号:");
scanf("%d", &stu[m].num);
for (i = 0; i < m; i++) {
if (stu[i].num == stu[m].num) {
printf("学号已存在!");
_getch();
fclose(fp);
return;
}
}
printf("姓名:");
scanf("%s", stu[m].name);
printf("性别:");
scanf("%s", stu[m].sex);
printf("出生年:");
scanf("%d", &stu[m].year);
printf("出生月:");
scanf("%d", &stu[m].month);
printf("出生日:");
scanf("%d", &stu[m].day);
printf("c语言:");
scanf("%f", &stu[m].C);
printf("高数:");
scanf("%f", &stu[m].math);
printf("大学物理:");
scanf("%f", &stu[m].physics);
stu[m].sum = stu[m].C + stu[m].math + stu[m].physics;
stu[m].avg = stu[m].sum / 3;
if (fwrite(&stu[m], LEN, 1, fp) != 1) {
printf("can not save!");
_getch();
} else {
printf("%s saved!\n", stu[m].name);
m++;
}
printf("continue?(y/n):");
scanf("%s", ch);
}
fclose(fp);
printf("OK!\n");
}
阅读全文