耒阳一中 2022-12-25 02:55 采纳率: 73.7%
浏览 43
已结题

C语言文件操作编程问题

img

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUM_STUDENTS 5
  4. #define NUM_COURSES 3
  5. typedef struct {
  6.     int student_number;
  7.     char name[20];
  8.     float courses[NUM_COURSES];
  9.     float average;
  10. } Student;
  11. int main(int argc, char *argv[]) {
  12.     if (argc != 2) {
  13.         printf("Usage: %s file_name\n", argv[0]);
  14.         return 1;
  15.     }
  16.     char *file_name = argv[1];
  17.     Student students[NUM_STUDENTS];
  18.     for (int i = 0; i < NUM_STUDENTS; i++) {
  19.         printf("Enter student number: ");
  20.         scanf("%d", &students[i].student_number);
  21.         printf("Enter name: ");
  22.         scanf("%s", students[i].name);
  23.         for (int j = 0; j < NUM_COURSES; j++) {
  24.             printf("Enter course %d score: ", j + 1);
  25.             scanf("%f", &students[i].courses[j]);
  26.         }
  27.         students[i].average = (students[i].courses[0] + students[i].courses[1] + students[i].courses[2]) / NUM_COURSES;
  28.     }
  29.     FILE *fp = fopen(file_name, "wb");
  30.     if (fp == NULL) {
  31.         perror("Error opening file");
  32.         return 1;
  33.     }
  34.     for (int i = 0; i < NUM_STUDENTS; i++) {
  35.         fwrite(&students[i], sizeof(Student), 1, fp);
  36.     }
  37.     fclose(fp);
  38.     return 0;
  39. }
  40. 嗯,输出结果就是比较不成功。嗯,想要大家再帮我看看代码

展开全部

  • 写回答

2条回答 默认 最新

  • a5156520 2022-12-25 03:47
    关注

    输出没问题,只要把平均成绩保留两位后在保存即可,另外可以用fread()函数再次读取文件并打印,以验证写入的数据是否正确,修改如下:

    参考链接:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define NUM_STUDENTS 5
    4. #define NUM_COURSES 3
    5. typedef struct {
    6. int student_number;
    7. char name[20];
    8. float courses[NUM_COURSES];
    9. float average;
    10. } Student;
    11. int main(int argc, char *argv[]) {
    12. if (argc != 2) {
    13. printf("Usage: %s file_name\n", argv[0]);
    14. return 1;
    15. }
    16. char *file_name = argv[1];
    17. Student students[NUM_STUDENTS];
    18. double avg;
    19. char temp[20];
    20. for (int i = 0; i < NUM_STUDENTS; i++) {
    21. printf("Enter student number: ");
    22. scanf("%d", &students[i].student_number);
    23. printf("Enter name: ");
    24. scanf("%s", students[i].name);
    25. for (int j = 0; j < NUM_COURSES; j++) {
    26. printf("Enter course %d score: ", j + 1);
    27. scanf("%f", &students[i].courses[j]);
    28. }
    29. avg= (students[i].courses[0] + students[i].courses[1] + students[i].courses[2]) / NUM_COURSES;
    30. // https://baike.baidu.com/link?url=_FbRjX1l4bRnFF8hQoqlw9-2HhQr4LDM-23DwSSLil86L0OO-bz5NDL5ljll4dgf47xbtOgMOF1Ny5MCFw67d0BOAsOgb2hbg1VpKI6WcsO
    31. sprintf(temp,"%.2f",avg); // 平均成绩保留两位小数 保存为字符串
    32. // https://www.runoob.com/cprogramming/c-function-atof.html
    33. students[i].average = (float)(atof(temp)); // 把保留两位小数的字符串转为浮点数
    34. }
    35. FILE *fp = fopen(file_name, "wb");
    36. if (fp == NULL) {
    37. perror("Error opening file");
    38. return 1;
    39. }
    40. for (int i = 0; i < NUM_STUDENTS; i++) {
    41. fwrite(&students[i], sizeof(Student), 1, fp);
    42. }
    43. fclose(fp);
    44. // 读取文件验证写入的数据是否正确
    45. fp = fopen(file_name, "r");
    46. if (fp == NULL) {
    47. perror("Error opening file");
    48. return 1;
    49. }
    50. Student rstudents[NUM_STUDENTS];
    51. printf("\n");
    52. for (int i = 0; i < NUM_STUDENTS; i++) {
    53. fread(&rstudents[i], sizeof(Student), 1, fp);
    54. }
    55. for (int i = 0; i < NUM_STUDENTS; i++) {
    56. printf("%d %s %f %f %f %f\n",rstudents[i].student_number,rstudents[i].name,
    57. rstudents[i].courses[0],rstudents[i].courses[1],rstudents[i].courses[2],rstudents[i].average);
    58. }
    59. fclose(fp);
    60. return 0;
    61. }

    img

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月25日
  • 已采纳回答 12月25日
  • 请详细说明问题背景 12月25日
  • 创建了问题 12月25日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部