C++逐行读取制表符分隔文本文件存入struct为键的map
实现方法
你当前用while (file >> content)的写法会把制表符、换行符全部识别为分隔符,既无法区分行边界,也无法区分键字段和值字段,需要改成逐行读取+按制表符拆分单行字段的逻辑,核心流程:
- 用
std::getline逐行读取文件内容,避免跨行混读,同时跳过空行 - 对每行文本,以制表符
\t为分隔符拆分所有字段,同时清理Windows换行带来的\r冗余字符、字段首尾多余空格 - 按结构映射字段:每行第一个字段作为
Letters的AS成员(即你说的_fLetters/_lLetters键值),BS成员先传空字符串适配当前需求;拆分出的第二个字段对应English语言值,第三个字段对应Deutsch语言值,多余字段直接忽略 - 增加基础校验:文件打开失败、单行字段数不足3个(1个键+2个语言值)时直接跳过,避免程序崩溃
完整实现代码
#include <fstream> #include <sstream> #include <string> #include <map> #include <array> #include <vector> struct Letters { std::string AS; std::string BS; Letters(std::string AS, std::string BS) : AS(AS), BS(BS) { }; bool operator<(const Letters& key) const { return AS < key.AS || (AS == key.AS && BS < key.BS); }; }; enum e{ English = 0, Deutsch = 1, NumberOfLanguages = 2 }; static std::map<Letters, const std::array<std::string, NumberOfLanguages>> mapTexts; int main() { std::ifstream file("letters.txt"); if (!file.is_open()) { return -1; } std::string line; while (std::getline(file, line)) { if (line.empty()) continue; std::istringstream line_ss(line); std::vector<std::string> fields; std::string field; // 按制表符拆分单行所有字段 while (std::getline(line_ss, field, '\t')) { // 清理字段首尾冗余的回车、空格字符 if (!field.empty() && field.front() == '\r') field.erase(0, 1); while (!field.empty() && (field.back() == ' ' || field.back() == '\r')) field.pop_back(); if (field.empty()) continue; fields.push_back(field); } // 字段不足:至少需要1个键+2个语言文本 if (fields.size() < 3) continue; // 组装键:当前需求BS为空,后续需要二级键可自行调整传值 Letters key(fields[0], ""); std::array<std::string, NumberOfLanguages> text_arr; text_arr[English] = fields[1]; text_arr[Deutsch] = fields[2]; mapTexts.emplace(key, text_arr); } file.close(); return 0; }
关键注意事项
- 不要直接用
>>运算符读取文件或字符串流,它会把空格、制表符、换行全部识别为分隔符,如果文本字段包含空格会被错误拆分,必须给getline指定\t作为分隔符 - 上述逻辑默认
_fLetters/_lLetters为完整键(BS为空),两个键因为AS值不同,即使BS为空也会被map识别为独立键,符合你的运算符重载逻辑 - 如果后续需要扩展BS作为二级键,只需要调整字段下标对应关系,把对应位置的字段传给Letters构造函数的第二个参数即可
- 代码自动兼容Windows(
\r\n)和Linux(\n)两种换行格式,不会出现因为隐藏回车字符导致键匹配失败的问题
内容的提问来源于stack exchange,提问作者SIMCHE
相关产品推荐
相关产品推荐

