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

如何通过令牌化提取lista.csv数据并映射至C语言结构体?

处理CSV文件并将数据存入结构体的完整实现

没问题,我来帮你搞定这个lista.csv的令牌化和结构体存储需求。你已经有了结构体的雏形,我来补全代码并解释关键步骤,确保能正确读取和分类每个字段。

完整实现代码

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

// 定义与CSV字段一一对应的结构体
struct datos {
    char ID;
    int temperature;
    char RH;
    long int time;
};

int main() {
    // 打开目标CSV文件
    FILE *file = fopen("lista.csv", "r");
    if (!file) {
        perror("无法打开lista.csv文件");
        return EXIT_FAILURE;
    }

    // 用动态数组存储结构体实例,避免固定大小的限制
    struct datos *data_collection = malloc(10 * sizeof(struct datos));
    if (!data_collection) {
        perror("内存分配失败");
        fclose(file);
        return EXIT_FAILURE;
    }
    int data_count = 0;
    int current_capacity = 10;

    // 按格式读取每行数据(假设CSV每行格式为:单字符ID,整数温度,单字符RH,长整数时间,比如:A,28,H,1690000000)
    while (fscanf(file, "%c,%d,%c,%ld", 
                  &data_collection[data_count].ID,
                  &data_collection[data_count].temperature,
                  &data_collection[data_count].RH,
                  &data_collection[data_count].time) == 4) {
        // 跳过每行末尾的换行符(%c会读取换行,必须手动处理避免干扰下一次读取)
        fgetc(file);
        
        data_count++;
        // 动态扩容:当数据量达到当前容量时,将容量翻倍
        if (data_count >= current_capacity) {
            current_capacity *= 2;
            struct datos *temp_ptr = realloc(data_collection, current_capacity * sizeof(struct datos));
            if (!temp_ptr) {
                perror("内存扩容失败");
                free(data_collection);
                fclose(file);
                return EXIT_FAILURE;
            }
            data_collection = temp_ptr;
        }
    }

    // 验证读取结果(可选,用于调试)
    printf("成功读取%d条数据:\n", data_count);
    for (int i = 0; i < data_count; i++) {
        printf("第%d条:ID=%c | 温度=%d℃ | RH=%c | 时间=%ld\n",
               i+1,
               data_collection[i].ID,
               data_collection[i].temperature,
               data_collection[i].RH,
               data_collection[i].time);
    }

    // 释放资源,避免内存泄漏
    free(data_collection);
    fclose(file);
    return EXIT_SUCCESS;
}

关键细节说明

  • 结构体定义:我补全了你的struct datos,确保每个成员的类型完全匹配你描述的CSV字段(ID为单字符、温度为整型、RH为单字符、时间为长整型)。
  • 文件读取逻辑:使用fscanf直接按CSV的格式提取数据,比手动用strtok分割字符串更简洁可靠,前提是CSV的每行格式严格一致。
  • 动态数组存储:用malloc和realloc实现动态扩容,这样不管CSV里有多少行数据,都不会出现数组大小不够的问题。
  • 换行符处理:因为%c格式符会读取换行符,所以每次读取一行后用fgetc(file)跳过换行,避免下一次读取时把换行符当成ID。

注意事项

如果你的ID或RH是多字符字符串(比如"Sensor01"而不是单字符'S'),需要修改结构体成员为字符数组,比如char ID[30];,同时把fscanf的格式符改成%29s(预留一个位置存字符串结束符,避免缓冲区溢出)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:08:17