-
- #include <stdio.h>
- #include <stdlib.h>
-
- #define NUM_STUDENTS 5
- #define NUM_COURSES 3
-
- typedef struct {
- int student_number;
- char name[20];
- float courses[NUM_COURSES];
- float average;
- } Student;
-
- int main(int argc, char *argv[]) {
- if (argc != 2) {
- printf("Usage: %s file_name\n", argv[0]);
- return 1;
- }
- char *file_name = argv[1];
-
- Student students[NUM_STUDENTS];
- for (int i = 0; i < NUM_STUDENTS; i++) {
- printf("Enter student number: ");
- scanf("%d", &students[i].student_number);
- printf("Enter name: ");
- scanf("%s", students[i].name);
- for (int j = 0; j < NUM_COURSES; j++) {
- printf("Enter course %d score: ", j + 1);
- scanf("%f", &students[i].courses[j]);
- }
- students[i].average = (students[i].courses[0] + students[i].courses[1] + students[i].courses[2]) / NUM_COURSES;
- }
-
- FILE *fp = fopen(file_name, "wb");
- if (fp == NULL) {
- perror("Error opening file");
- return 1;
- }
-
- for (int i = 0; i < NUM_STUDENTS; i++) {
- fwrite(&students[i], sizeof(Student), 1, fp);
- }
-
- fclose(fp);
-
- return 0;
- }
- 嗯,输出结果就是比较不成功。嗯,想要大家再帮我看看代码

C语言文件操作编程问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- a5156520 2022-12-25 03:47关注
输出没问题,只要把平均成绩保留两位后在保存即可,另外可以用fread()函数再次读取文件并打印,以验证写入的数据是否正确,修改如下:
参考链接:- #include <stdio.h>
- #include <stdlib.h>
- #define NUM_STUDENTS 5
- #define NUM_COURSES 3
- typedef struct {
- int student_number;
- char name[20];
- float courses[NUM_COURSES];
- float average;
- } Student;
- int main(int argc, char *argv[]) {
- if (argc != 2) {
- printf("Usage: %s file_name\n", argv[0]);
- return 1;
- }
- char *file_name = argv[1];
- Student students[NUM_STUDENTS];
- double avg;
- char temp[20];
- for (int i = 0; i < NUM_STUDENTS; i++) {
- printf("Enter student number: ");
- scanf("%d", &students[i].student_number);
- printf("Enter name: ");
- scanf("%s", students[i].name);
- for (int j = 0; j < NUM_COURSES; j++) {
- printf("Enter course %d score: ", j + 1);
- scanf("%f", &students[i].courses[j]);
- }
- avg= (students[i].courses[0] + students[i].courses[1] + students[i].courses[2]) / NUM_COURSES;
- // https://baike.baidu.com/link?url=_FbRjX1l4bRnFF8hQoqlw9-2HhQr4LDM-23DwSSLil86L0OO-bz5NDL5ljll4dgf47xbtOgMOF1Ny5MCFw67d0BOAsOgb2hbg1VpKI6WcsO
- sprintf(temp,"%.2f",avg); // 平均成绩保留两位小数 保存为字符串
- // https://www.runoob.com/cprogramming/c-function-atof.html
- students[i].average = (float)(atof(temp)); // 把保留两位小数的字符串转为浮点数
- }
- FILE *fp = fopen(file_name, "wb");
- if (fp == NULL) {
- perror("Error opening file");
- return 1;
- }
- for (int i = 0; i < NUM_STUDENTS; i++) {
- fwrite(&students[i], sizeof(Student), 1, fp);
- }
- fclose(fp);
- // 读取文件验证写入的数据是否正确
- fp = fopen(file_name, "r");
- if (fp == NULL) {
- perror("Error opening file");
- return 1;
- }
- Student rstudents[NUM_STUDENTS];
- printf("\n");
- for (int i = 0; i < NUM_STUDENTS; i++) {
- fread(&rstudents[i], sizeof(Student), 1, fp);
- }
- for (int i = 0; i < NUM_STUDENTS; i++) {
- printf("%d %s %f %f %f %f\n",rstudents[i].student_number,rstudents[i].name,
- rstudents[i].courses[0],rstudents[i].courses[1],rstudents[i].courses[2],rstudents[i].average);
- }
- fclose(fp);
- return 0;
- }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录