C++如何读取字符串与数值混合的文件并赋值给自定义struct
解决思路
你现有的结构体缺少数组长度记录,仅靠指针无法判断数组有效元素范围,建议先补充长度字段,再通过逐行识别标识+动态扩容数组的方式完成读取:
步骤1:调整结构体定义(可选但强烈建议)
struct sample_struct { int data1; int data2_len; // 记录data2数组的元素个数 double* data2; int data3_len; // 记录data3数组的元素个数 double* data3; };
如果必须保留原结构体定义,也可以单独维护两个局部变量记录data2、data3的长度,但后续访问数组时容易出现越界问题,不推荐。
步骤2:核心读取逻辑
核心逻辑是逐行读取文件内容,先识别data X标识行确定当前待赋值的成员,再对后续读到的数值通过realloc动态扩容对应数组:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 128 int main() { // 初始化结构体 struct sample_struct obj = {0, 0, NULL, 0, NULL}; char buf[BUF_SIZE] = {0}; // 标识当前正在读取的字段:0未指定,1读data1,2读data2,3读data3 int current_target = 0; FILE* fp = fopen("替换为你的实际文件路径", "r"); if (fp == NULL) { perror("文件打开失败"); return -1; } while (fgets(buf, BUF_SIZE, fp) != NULL) { // 去掉行尾换行符 buf[strcspn(buf, "\n")] = 0; // 判断是否为标识行 if (strstr(buf, "data ") != NULL) { if (strcmp(buf, "data 1") == 0) { current_target = 1; } else if (strcmp(buf, "data 2") == 0) { current_target = 2; } else if (strcmp(buf, "data 3") == 0) { current_target = 3; } continue; } // 处理数值行 double num = atof(buf); switch(current_target) { case 1: obj.data1 = (int)num; current_target = 0; // data1只有一个值,读完重置目标 break; case 2: // 动态扩容data2数组 obj.data2 = realloc(obj.data2, sizeof(double) * (obj.data2_len + 1)); obj.data2[obj.data2_len] = num; obj.data2_len++; break; case 3: // 动态扩容data3数组 obj.data3 = realloc(obj.data3, sizeof(double) * (obj.data3_len + 1)); obj.data3[obj.data3_len] = num; obj.data3_len++; break; default: printf("未知标识的数值行:%s\n", buf); } } fclose(fp); // 测试输出结果 printf("data1: %d\n", obj.data1); printf("data2 长度:%d,元素:", obj.data2_len); for (int i = 0; i < obj.data2_len; i++) printf("%.0f ", obj.data2[i]); printf("\ndata3 长度:%d,元素:", obj.data3_len); for (int i = 0; i < obj.data3_len; i++) printf("%.0f ", obj.data3[i]); printf("\n"); // 用完释放内存,避免泄漏 free(obj.data2); free(obj.data3); return 0; }
注意事项
realloc扩容失败会返回NULL,正式使用时建议加返回值判断,避免内存泄漏- 如果数值可能超过double精度,可以根据实际需求更换数据类型
- 读取大文件时可以预分配数组容量,减少realloc的调用次数,提升性能
内容的提问来源于stack exchange,提问作者new to coding
相关产品推荐
相关产品推荐

