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

C++ 如何处理含多种数据类型的文本文件并完成数据解析存储?

C++ 结构化txt文件数据解析方案

先明确文件结构

你提供的txt是严格结构化的,格式逻辑如下:

  • 第1行:整数,代表总共有4个人员条目
  • 每个人员的固定结构:
    • 姓名:2个连续字符串(名+姓)
    • 整数:代表该人员的成绩行数
    • 对应行数的成绩:每行5个浮点数,所有成绩都属于当前人员

最适合初学者的解析方法

你不用强行用getline按行读取,C++的cin/文件流默认会自动跳过所有空白字符(包括空格、换行、制表符),刚好适配你这个全靠空白分隔的文件格式,逻辑写起来非常简单,不容易出错。


具体实现步骤

1. 引入头文件、定义存储结构

把同一个人的所有信息存在结构体里,方便后续操作:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std; // 练习阶段使用可以省去反复写std::的麻烦

// 定义人员信息结构体
struct Person {
    string firstName; // 名
    string lastName; // 姓
    int scoreLineCnt; // 该人员的成绩行数
    vector<double> scores; // 存储所有浮点型成绩
};

2. 核心读取逻辑

int main() {
    // 打开文件,注意替换成你自己的文件实际路径
    ifstream inputFile("你的数据文件路径.txt");
    // 一定要加打开失败判断,避免后续莫名其妙报错
    if (!inputFile.is_open()) {
        cout << "文件打开失败,请检查路径是否正确" << endl;
        return 1;
    }

    int totalPerson;
    // 读取第一行的总人数
    inputFile >> totalPerson;

    // 用vector存储所有人员的完整信息
    vector<Person> allPeople;
    allPeople.reserve(totalPerson); // 预先分配空间提高效率,可选

    // 循环读取每个人的信息
    for (int i = 0; i < totalPerson; i++) {
        Person p;
        // 读取姓名的两个字符串
        inputFile >> p.firstName >> p.lastName;
        // 读取该人员的成绩行数
        inputFile >> p.scoreLineCnt;
        // 读取对应数量的成绩:每行5个,总共scoreLineCnt * 5个
        int totalScore = p.scoreLineCnt * 5;
        p.scores.reserve(totalScore);
        for (int j = 0; j < totalScore; j++) {
            double score;
            inputFile >> score;
            p.scores.push_back(score);
        }
        allPeople.push_back(p);
    }

    // 读取完成关闭文件
    inputFile.close();

    // ========== 后续操作示例 ==========
    // 例1:计算第一个人Eric的所有成绩平均值
    double sum = 0;
    for (double s : allPeople[0].scores) {
        sum += s;
    }
    double avg = sum / allPeople[0].scores.size();
    cout << allPeople[0].firstName << "的平均成绩是:" << avg << endl;

    // 例2:累加所有人的成绩行数,得到总成绩行数
    int totalLine = 0;
    for (const auto& person : allPeople) {
        totalLine += person.scoreLineCnt;
    }
    cout << "总共有" << totalLine << "行成绩" << endl;

    return 0;
}

常见报错原因排查

  • 文件路径写错:如果用相对路径,要确保txt文件和编译出的exe在同一个文件夹下,或者写完整的绝对路径比如"C:\\Users\\xxx\\Desktop\\data.txt"(注意Windows下路径分隔符要写两个反斜杠)
  • 数据类型不匹配:比如用int类型变量接收浮点成绩,会导致读取失败,后续所有数据全错
  • 如果你一定要用getline按行读取,要注意用>>读取整数/字符串后,缓冲区会残留一个换行符,需要调用inputFile.ignore()跳过这个换行符,否则下一次getline会读到空内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:04