You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言读取TXT文件并将学生信息存储到RECORD数据结构中?

解决C语言读取学生信息文本文件的问题

嘿,刚好我之前处理过类似的场景,这两个问题其实都可以用C语言标准库的输入函数轻松解决,我给你一步步讲清楚:

第一步:先定义你的RECORD数据结构

首先咱们得先把存储学生信息的结构体定义好,根据你的需求,大概是这样:

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

#define MAX_NAME_LEN 50

// 定义学生记录结构体
typedef struct {
    int studentID;          // 假设学生ID是整数,要是带字母的学号就改成char数组
    char firstName[MAX_NAME_LEN];
    char lastName[MAX_NAME_LEN];
    int score;              // 分数如果是小数就改成float/double
} RECORD;

问题1:按空格分隔读取各个字段

C语言的fscanf()函数天生就适合处理空白字符分隔的输入(空格、换行、制表符都算空白),它会自动跳过这些分隔符,直接读取对应格式的内容。

比如你的文本文件每一行是这样的格式:

1001 Alice Smith 85
1002 Bob Johnson 92

那我们可以直接用fscanf()指定格式字符串,一次性读取四个字段。

问题2:自动换行读取下一位学生

fscanf()会自动忽略换行符(属于空白字符),所以当你读完一行的四个字段后,下一次调用fscanf()会直接跳到下一行的第一个字段,完全不用手动处理换行!

方法1:直接用fscanf循环读取(简单高效)

这种方法适合确定文件格式完全规范的情况:

int main() {
    FILE *fp = fopen("students.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    RECORD students[100];  // 假设最多存储100个学生,也可以用动态分配内存
    int count = 0;
    int read_result;

    // 循环读取直到文件结束
    while ((read_result = fscanf(fp, "%d %s %s %d", 
                                &students[count].studentID,
                                students[count].firstName,
                                students[count].lastName,
                                &students[count].score)) != EOF) {
        // 检查是否成功读取了4个字段(避免格式错误的行)
        if (read_result == 4) {
            count++;
        } else {
            printf("警告:第%d行格式错误,跳过\n", count+1);
            // 跳过当前行的剩余内容,避免卡住
            char temp[100];
            fgets(temp, sizeof(temp), fp);
        }
    }

    // 打印读取到的学生信息,验证结果
    printf("共读取到%d位学生信息:\n", count);
    for (int i = 0; i < count; i++) {
        printf("ID: %d, 姓名: %s %s, 分数: %d\n",
               students[i].studentID,
               students[i].firstName,
               students[i].lastName,
               students[i].score);
    }

    fclose(fp);
    return 0;
}

方法2:逐行读取+解析(更严谨,适合格式可能有波动的情况)

如果担心文件里有格式不规范的行(比如某一行多了空格、少了字段),可以先用fgets()读取整行,再用sscanf()解析这一行的内容:

int main() {
    FILE *fp = fopen("students.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    RECORD students[100];
    int count = 0;
    char line[200];  // 存储整行内容,大小要足够容纳最长的行

    while (fgets(line, sizeof(line), fp) != NULL) {
        // 解析当前行的内容
        if (sscanf(line, "%d %s %s %d",
                  &students[count].studentID,
                  students[count].firstName,
                  students[count].lastName,
                  &students[count].score) == 4) {
            count++;
        } else {
            printf("警告:第%d行格式错误,跳过\n", count+1);
        }
    }

    // 验证输出部分和上面一样
    printf("共读取到%d位学生信息:\n", count);
    for (int i = 0; i < count; i++) {
        printf("ID: %d, 姓名: %s %s, 分数: %d\n",
               students[i].studentID,
               students[i].firstName,
               students[i].lastName,
               students[i].score);
    }

    fclose(fp);
    return 0;
}

几个注意事项

  • 如果你学生ID是字符串(比如带字母的学号),把int studentID改成char studentID[20],然后格式字符串里的%d换成%s就行。
  • 定义名字数组的时候,要给足够的长度,避免溢出。
  • 一定要检查文件是否成功打开,避免空指针错误。
  • 记得最后关闭文件,释放资源。

内容的提问来源于stack exchange,提问作者Vasillis Kontis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:01:52