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

C++中如何读取带空格字符串并仅以'\r'为分割符拆分

问题根源

你当前代码拆分失败的核心原因,是使用了iss >> temp的方式做字符串读取:

  • 这个读取方式的默认规则是自动跳过所有前导空白,并且读取到任意空白字符(空格、制表符、换行、回车等)就立刻停止
  • 所以会自然把带空格的字符串拆成零散片段,完全不符合“仅在'\r'位置拆分、空格完整保留”的需求。
修正方法

改用**带自定义分隔符的std::getline**完成拆分逻辑,将拆分分隔符显式指定为'\r'即可。
std::getline的工作逻辑是:从流的当前位置开始读取所有字符,直到遇到指定的分隔符为止,读取过程中不会把空格、制表符等普通空白作为终止条件,所有目标区间内的内容都会被完整保留。

适配你原有代码的最小修改版本

std::vector<std::string> m_list;
std::ifstream input("data.txt");
std::string str;
std::getline(input, str);
std::istringstream iss(str);
std::string temp;
// 核心修改:将原来的iss >> temp替换为以'\r'为分隔符的getline调用
while (std::getline(iss, temp, '\r'))
{
    m_list.push_back(temp);
}

更高效的简化写法

如果你的文件本身就是用'\r'作为条目分隔的,完全没必要先把整段内容读入临时字符串再二次拆分,可以直接从文件流按'\r'为分隔符逐段读取,减少不必要的字符串拷贝:

std::vector<std::string> m_list;
std::ifstream input("data.txt");
std::string temp;
while (std::getline(input, temp, '\r'))
{
    m_list.push_back(temp);
}
实际拆分效果

修改后的逻辑会严格匹配你的拆分要求:

  • 只有读取到字符为'\r'的位置,才会把之前累计的内容作为独立条目存入列表
  • 作为分隔符的'\r'字符会被从流中消费,不会残留到最终的条目内容里
  • 所有内容里的空格、制表符等非'\r'字符,都会被原封不动保留在对应条目里,不会被拆分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 11:15:04