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

