#include<stdio.h>
#include<stdlib.h>
#define N 100
struct students { // 保持结构体名称一致
long int number;
char name[10];
int score; // 修改为只有一个整型的score,代表一门课程的成绩
};
int main() { // main 函数的返回类型应为 int
struct students stu[N]; // 修改为正确的结构体名称
int i, num;
FILE *file; // 定义文件指针
// 输入学生信息
printf("请输入学生人数<%d>:", N);
scanf("%d", &num);
if (num > N) {
printf("学生人数不能超过%d\n", N);
return 1; // 如果输入的学生人数超过N,则程序返回1表示错误
}
// 打开文件准备写入
file open("studebts.txt","w");
if (file==NULL)
{
printf("error\n");
return 0;}
}
printf("请输入学生信息:\n");
for (i = 0; i < num; i++) {
printf("第%d位学生的学号:", i + 1);
scanf("%ld", &stu[i].number);
printf("第%d位学生的姓名:", i + 1); // 添加了冒号
scanf("%9s", stu[i].name); // 使用%9s防止输入超过数组长度的字符串
printf("第%d位学生的课程成绩:", i + 1); // 修改了文字描述
scanf("%d", &stu[i].score); // 只输入一个成绩
// 将学生信息写入文件
fprintf(file, "%ld\t%s\t%d\n", stu[i].number, stu[i].name, stu[i].score);
}
// 关闭文件
fclose(file);
// 打开文件准备读取
file = fopen("students.txt", "r");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 输出学生信息
printf("\n 学号\t姓名\t课程成绩\n"); // 修改了表头
while (fscanf(file, "%ld\t%9s\t%d", &stu[i].number, stu[i].name, &stu[i].score) != EOF)
{
printf("%ld\t%-10s\t%-8d\n", stu[i].number, stu[i].name, stu[i].score); // 只需要输出一个成绩
}
// 关闭文件
fclose(file);
return 0; // main 函数应该返回一个值,通常返回 0 表示程序正常结束
}
需要注意的是:
- 我定义了一个宏
FILE_NAME
来指定文件名。 - 在写入文件之前,我使用
fopen()
函数以写入模式("w")打开文件,并检查文件是否成功打开。 - 在写入循环中,我使用
fprintf()
函数将学生信息写入文件。 - 在写入完成后,我使用
fclose()
函数关闭文件。 - 然后,我以读取模式("r")重新打开文件,并使用
fscanf()
函数从文件中读取学生信息,并输出到控制台。 - 在读取时,我使用了
while
循环和fscanf()
函数的返回值来检查是否已到达文件末尾(EOF)。 - 在读取完成后,我再次使用
fclose()
函数关闭文件。
请确保程序有权限创建和写入到students.txt
文件,并且该文件在执行程序时是可访问的。