我希望获得学生姓名的中期和最终分数并将其写入txt文件,但是当我使用循环时,它永远不会得到学生姓名。它总是给它一个错过。如何在循环中使用feof?我希望得到学生的中期和最后一点的名字,并从得分中计算平均值,并且必须始终得到名称和分数,直到用户按下文件末尾。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main()
{
FILE *Points;
char namesOfStudents[10];
int pointsOfStudents[1][2];
double AverageOfStudents[1];
int i=0,j=1;
int numberOfStudents;
Points = fopen("C:\\Users\\Toshiba\\Desktop\\PointsOfStudent.txt", "a+");
fprintf(Points, "Name\t\t 1.Grade\t2.Grade\t\tAverage\n");
/* printf("How many students will you enter: ");
scanf("%d",&numberOfStudents);*/
//while (!feof(Points))
printf("Please enter new students name: ");
gets(namesOfStudents);
printf("\nPlease enter new students first point: ");
scanf("%d",&pointsOfStudents[0][0]);
printf("\nPlease enter new students second point: ");
scanf("%d",&pointsOfStudents[0][1]);
for (; i < strlen(namesOfStudents); i++)
{
fprintf(Points, "%c", namesOfStudents[i]); //To write
student name to file
}
fprintf(Points,"\t\t ");
fprintf(Points,"%d\t\t",pointsOfStudents[0][0]); //to write
student's first point
fprintf(Points,"%d\t\t",pointsOfStudents[0][1]); //to write
student's second point
fprintf(Points,"%d\n",(pointsOfStudents[0][0]+pointsOfStudents[0]
[1])/2); //to calculate and write average
system("cls");
fclose(Points);
system("Pause");
}
答案 0 :(得分:0)
有几件事:
首先, 永远不会永远不会 使用gets
- 这很危险,会引入失败点, /或代码中的大量安全漏洞,自2011版语言标准版本起,它已从标准库中删除。请改用fgets
:
fgets( nameOfStudents, sizeof nameOfStudents, stdin );
其次,while( !feof( fp ) )
总是错误的。根据{{1}}的输入,它会经常循环一次。在输出到fp
时,它没有意义。
您可以使用fp
的结果来控制循环:
fgets
当您从终端输入数据后,使用 Ctrl Z 或 Ctrl D (取决于您的平台)。
第三,while ( fgets( nameOfStudents, sizeof nameOfStudents, stdin ) )
{
...
}
返回main
,而不是int
;使用
void
代替。
最后,改变
int main( void )
到
for (; i < strlen(namesOfStudents); i++)
{
fprintf(Points, "%c", namesOfStudents[i]); //To write student name to file
}
将学生姓名写入文件。
还有其他问题,但要进行这些更改,看看是否有帮助。