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
相关产品推荐
相关产品推荐

