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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:31:06