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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:01