如何通过令牌化提取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
相关产品推荐
相关产品推荐

