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

如何在C语言中从文件提取并存储以分号结尾的特定字段?

在C语言中提取分号分隔的文件字段并存储

你的需求是从分号分隔的文本文件里提取姓名、性别等字段,分别存到字符串中。最清晰的做法是用结构体统一管理每个条目的所有字段,结合逐行读取和字符串分割来实现。

核心实现步骤

  • 定义结构体,对应文件里的每个字段
  • 打开目标文件,逐行读取内容
  • 用字符串分割函数拆分每行的各个字段
  • 将拆分后的字段存入结构体数组
  • 完成后关闭文件,按需使用存储的数据

完整代码示例

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

// 定义结构体,对应文件中的所有字段
typedef struct {
    char name[100];     // 姓名
    char gender[10];    // 性别
    char birthdate[20]; // 出生日期
    char region[50];    // 地区
    char score1[20];    // 第一个分数
    char score2[20];    // 第二个分数
    char score3[20];    // 第三个分数
    char score4[20];    // 第四个分数
    char score5[20];    // 第五个分数
    char score6[20];    // 第六个分数
} Person;

#define MAX_LINE_LENGTH 256  // 每行最大长度,可根据实际调整
#define MAX_PEOPLE 100       // 最多存储的条目数

int main() {
    FILE *file = fopen("data.txt", "r"); // 替换成你的目标文件名
    if (!file) {
        perror("无法打开文件");
        return 1;
    }

    Person people[MAX_PEOPLE];
    int count = 0;
    char line[MAX_LINE_LENGTH];

    // 逐行读取文件内容
    while (fgets(line, sizeof(line), file) != NULL && count < MAX_PEOPLE) {
        // 用strtok分割字段,分隔符包含分号和换行符
        char *token = strtok(line, ";\n");
        if (token == NULL) continue; // 跳过空行
        strncpy(people[count].name, token, sizeof(people[count].name)-1);
        people[count].name[sizeof(people[count].name)-1] = '\0'; // 确保字符串结束

        token = strtok(NULL, ";\n");
        if (token) {
            strncpy(people[count].gender, token, sizeof(people[count].gender)-1);
            people[count].gender[sizeof(people[count].gender)-1] = '\0';
        }

        token = strtok(NULL, ";\n");
        if (token) {
            strncpy(people[count].birthdate, token, sizeof(people[count].birthdate)-1);
            people[count].birthdate[sizeof(people[count].birthdate)-1] = '\0';
        }

        token = strtok(NULL, ";\n");
        if (token) {
            strncpy(people[count].region, token, sizeof(people[count].region)-1);
            people[count].region[sizeof(people[count].region)-1] = '\0';
        }

        // 依次处理后续的分数字段
        token = strtok(NULL, ";\n");
        if (token) strncpy(people[count].score1, token, sizeof(people[count].score1)-1);
        token = strtok(NULL, ";\n");
        if (token) strncpy(people[count].score2, token, sizeof(people[count].score2)-1);
        token = strtok(NULL, ";\n");
        if (token) strncpy(people[count].score3, token, sizeof(people[count].score3)-1);
        token = strtok(NULL, ";\n");
        if (token) strncpy(people[count].score4, token, sizeof(people[count].score4)-1);
        token = strtok(NULL, ";\n");
        if (token) strncpy(people[count].score5, token, sizeof(people[count].score5)-1);
        token = strtok(NULL, ";\n");
        if (token) strncpy(people[count].score6, token, sizeof(people[count].score6)-1);

        count++;
    }

    fclose(file);

    // 示例:打印已存储的数据
    printf("共读取%d条数据:\n", count);
    for (int i = 0; i < count; i++) {
        printf("第%d条:\n", i+1);
        printf("姓名:%s\n", people[i].name);
        printf("性别:%s\n", people[i].gender);
        printf("出生日期:%s\n", people[i].birthdate);
        printf("地区:%s\n", people[i].region);
        printf("分数:%s, %s, %s, %s, %s, %s\n\n",
               people[i].score1, people[i].score2, people[i].score3,
               people[i].score4, people[i].score5, people[i].score6);
    }

    return 0;
}

关键细节说明

  • 结构体管理:把每个字段对应到结构体成员,避免零散的变量,方便后续访问和维护。
  • 文件读取:用fgets逐行读取,既适合处理大文件,也能自然捕获每行的换行符。
  • 字符串分割:strtok以";\n"为分隔符,既能拆分分号分隔的字段,也能自动去掉每行末尾的换行符。注意第一次调用传行缓冲区,后续调用传NULL即可继续分割当前行。
  • 安全复制:用strncpy代替strcpy,避免缓冲区溢出,同时手动添加'\0'保证字符串的有效性。
  • 错误处理:检查文件是否成功打开,避免程序因文件不存在或权限问题崩溃。

特殊情况提示

如果你的文件字段中可能包含分号(比如姓名里有分号),strtok就不再适用,需要自己实现更复杂的解析逻辑(比如处理引号包裹的字段)。但从你提供的示例文件来看,strtok完全能满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:40:50