C语言将信息存放到文件里

键盘输入6名学生信息(学号、姓名、专业、性别、班级、出生年月日、两门课程的成绩),计算每名学生总分,将原有数据和平均分存放在磁盘文件stu.txt中

基于new bing部分指引作答:
下面是一个简单的示例程序,用于从键盘录入6名学生信息,并将数据和平均数存储在磁盘文件stu.txt中。代码注释由助手为您提供。

#include <stdio.h>
#include <stdlib.h>

#define MAX_STUDENTS 6 // 最大学生数量
#define STR_LEN 20 // 字符串最大长度(包括末尾 '\0')

// 学生信息结构体
struct Student {
    char id[STR_LEN]; // 学号
    char name[STR_LEN]; // 姓名
    char major[STR_LEN]; // 专业
    char gender[STR_LEN]; // 性别
    char classname[STR_LEN]; // 班级
    char birthdate[STR_LEN]; // 出生年月日
    float score1; // 第一门课程成绩
    float score2; // 第二门课程成绩
    float total_score; // 总分
};

int main() {
    struct Student students[MAX_STUDENTS]; // 学生数组

    // 录入学生信息
    for (int i = 0; i < MAX_STUDENTS; i++) {
        printf("请输入第 %d 个学生的信息:\n", i+1);
        printf("学号:"); scanf("%s", students[i].id);
        printf("姓名:"); scanf("%s", students[i].name);
        printf("专业:"); scanf("%s", students[i].major);
        printf("性别:"); scanf("%s", students[i].gender);
        printf("班级:"); scanf("%s", students[i].classname);
        printf("出生年月日:"); scanf("%s", students[i].birthdate);
        printf("第一门课成绩:"); scanf("%f", &students[i].score1);
        printf("第二门课成绩:"); scanf("%f", &students[i].score2);

        // 计算总分
        students[i].total_score = students[i].score1 + students[i].score2;
    }

    // 计算平均分
    float avg_score = 0.0;
    for (int i = 0; i < MAX_STUDENTS; i++) {
        avg_score += students[i].total_score;
    }
    avg_score /= MAX_STUDENTS;

    // 打开文件以保存结果
    FILE *fp = fopen("stu.txt", "w");

    if (fp == NULL) {
        printf("打开文件失败!请检查权限或磁盘空间。\n");
        return -1;
    }

    // 写入学生信息和平均分到文件中
    fprintf(fp, "学号\t姓名\t专业\t性别\t班级\t出生年月日\t成绩1\t成绩2\t总分\n");
    for (int i = 0; i < MAX_STUDENTS; i++) {
        struct Student s = students[i];
        fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%.1f\t%.1f\t%.1f\n", 
            s.id, s.name, s.major, s.gender, s.classname, s.birthdate,
            s.score1, s.score2, s.total_score);
    }
    fprintf(fp, "平均分:%.1f\n", avg_score);

    // 关闭文件
    fclose(fp);

    printf("已将结果保存至stu.txt中。\n");

    return 0;
}

请注意,此示例程序只是一个基本模板,您实际使用时应根据需要进行相应的修改和扩展。另外,该程序没有对输入数据的有效性进行严格检查,您可能需要添加一些范围和格式验证以防止非法输入。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7728171
  • 除此之外, 这篇博客: C语言实现字符串转二进制编码,并保存.txt中的 二、代码实现,转化后二进制的保存成.txt文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    #include <string.h>
    
    //字符串转二进制编码
    int str_to_bin_save(char *str)
    {
        //打开文件
        FILE *fp;
        if((fp = fopen("word.txt","w")) == NULL)
        {
            printf("Open file is failed");
            return -1;
        }
        char len = strlen(str);
        printf("len:%d\n",len);
        char tmp;
        for(int i=0;i<len;i++){
            tmp = str[i];
            for(int j=0;j<8;j++){
                if(tmp & 0x80) { //1000,0000
                    //printf("1");
                    fputc('1',fp);
                }
                else{
                    //printf("0");
                    fputc('0',fp);
                }
                tmp = tmp << 1 ;
            }
            fprintf(fp,"\n");
            //printf("\n") ;
        }
        fclose(fp);
        return 0;
    }
    
    void str_to_bin_save_test()
    {
        char str[] = "Welcome to FPGA";
        // char str[100];
        // printf("please input:\n");
        /*  scanf()函数在读取字符串时以空格为分隔,
            遇到空格就认为当前字符串结束了,
            所以无法读取含有空格的字符串。*/
        //scanf("%s",&str);  
        
        /*  gets()函数认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,
            所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。
            换句话说,gets() 用来读取一整行字符串。*/
        //gets(str);  
    
        str_to_bin_save(str);
    }
    
    int main()
    {
        str_to_bin_save_test();
        return 0;
    }
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    我们可以通过结构体来存储学生信息,文件保存使用二进制文件,计算总分和平均分时可以利用结构体中的信息。下面是示例代码:

    #include <stdio.h>
    #include <string.h>
    
    #define STUDENT_NUM 6
    
    /* 学生信息结构体 */
    struct StudentInfo {
        char num[10];      /* 学号 */
        char name[20];     /* 姓名 */
        char major[30];    /* 专业 */
        char gender[10];   /* 性别 */
        char class[20];    /* 班级 */
        int year;          /* 出生年份 */
        int month;         /* 出生月份 */
        int day;           /* 出生日期 */
        int score1;        /* 成绩1 */
        int score2;        /* 成绩2 */
    };
    
    /* 给学生信息结构体赋值 */
    void SetStudentInfo(struct StudentInfo *info)
    {
        printf("请输入学号:");
        scanf("%s", info->num);
    
        printf("请输入姓名:");
        scanf("%s", info->name);
    
        printf("请输入专业:");
        scanf("%s", info->major);
    
        printf("请输入性别:");
        scanf("%s", info->gender);
    
        printf("请输入班级:");
        scanf("%s", info->class);
    
        printf("请输入出生年月日,格式如下:\n");
        printf("年份:");
        scanf("%d", &(info->year));
        printf("月份:");
        scanf("%d", &(info->month));
        printf("日期:");
        scanf("%d", &(info->day));
    
        printf("请输入成绩1:");
        scanf("%d", &(info->score1));
    
        printf("请输入成绩2:");
        scanf("%d", &(info->score2));
    }
    
    /* 计算某个学生的总分 */
    int GetTotalScore(const struct StudentInfo *info)
    {
        return info->score1 + info->score2;
    }
    
    /* 计算某个学生的平均分 */
    float GetAverageScore(const struct StudentInfo *info)
    {
        return (float)GetTotalScore(info) / 2;
    }
    
    /* 保存所有学生信息到文件 */
    void SaveStudentInfoToFile(const struct StudentInfo *student, const char *file_path)
    {
        FILE *fp = fopen(file_path, "wb");
        if (fp == NULL) {
            printf("文件打开失败!\n");
            return;
        }
    
        int i;
        for (i = 0; i < STUDENT_NUM; i++) {
            fwrite(&student[i], sizeof(struct StudentInfo), 1, fp);
        }
    
        fclose(fp);
    }
    
    int main()
    {
        struct StudentInfo student[STUDENT_NUM];
        int i;
    
        for (i = 0; i < STUDENT_NUM; i++) {
            int index = i + 1;
            printf("请输入第%d位学生的信息:\n", index);
            SetStudentInfo(&student[i]);
        }
    
        SaveStudentInfoToFile(student, "student.dat");
    
        for (i = 0; i < STUDENT_NUM; i++) {
            int index = i + 1;
            printf("学生%d的总分为%d,平均分为%.1f\n",
                   index, GetTotalScore(&student[i]), GetAverageScore(&student[i]));
        }
    
        return 0;
    }
    

    在运行程序时,需要依次输入每位学生的信息。例如:

    请输入第1位学生的信息:
    请输入学号:1001
    请输入姓名:张三
    请输入专业:计算机
    请输入性别:男
    请输入班级:1001
    请输入出生年月日,格式如下:
    年份:1999
    月份:4
    日期:20
    请输入成绩1:80
    请输入成绩2:90
    请输入第2位学生的信息:
    请输入学号:1002
    请输入姓名:李四
    请输入专业:网络工程
    请输入性别:女
    请输入班级:1002
    请输入出生年月日,格式如下:
    年份:2000
    月份:5
    日期:12
    请输入成绩1:85
    请输入成绩2:90
    ...
    

    程序运行结束后,会在当前目录下生成一个 student.dat 的文件,其中保存了所有学生的信息。

    同时,程序还会计算每个学生的总分和平均分,并输出到屏幕上。例如:

    学生1的总分为170,平均分为85.0
    学生2的总分为175,平均分为87.5
    学生3的总分为170,平均分为85.0
    学生4的总分为165,平均分为82.5
    学生5的总分为160,平均分为80.0
    学生6的总分为170,平均分为85.0