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

C++读取文件时如何将连续空格分别作为单独单词存储

问题原因分析

你当前使用的std::ifstream的>>流提取运算符默认会跳过所有空白字符(空格、换行、制表符等),连续的空格会被直接忽略不会读入到string对象中,这是代码不符合需求的核心原因。

调整方案

要实现单个空格单独作为元素存储,需要逐个字符读取文件内容,手动区分普通字符和空格分别处理:

  • 遇到非空格字符时,暂存到临时字符串中,攒成完整的非空格单词
  • 遇到空格字符时:
    1. 如果临时字符串不为空,先把临时字符串作为一个元素存入容器,清空临时字符串
    2. 把当前单个空格作为单独元素存入容器
  • 整个文件读取完成后,检查临时字符串是否还有未存储的内容,把最后一个非空格单词存入容器
完整调整代码

这里优先使用std::vector<std::string>存储结果,不需要预先预估元素数量,安全性更高,如果确实需要使用原生动态数组可以参考注释中的转换逻辑:

#include <fstream>
#include <string>
#include <vector>

std::vector<std::string> strVec;
std::ifstream file(filename);
if (file) {
    std::string currentWord;
    char c;
    // 逐个字符读取,不跳过任何字符
    while (file.get(c)) {
        if (c == ' ') { 
            // 遇到空格先处理之前攒的非空格单词
            if (!currentWord.empty()) {
                strVec.push_back(currentWord);
                currentWord.clear();
            }
            // 单个空格作为单独元素存储
            strVec.push_back(std::string(1, ' '));
        } else if (c == '\n' || c == '\r') {
            // 这里默认忽略换行符,如果需要把换行作为单独元素存储可以删除该分支
            continue;
        } else {
            // 非空格字符攒入当前单词
            currentWord += c;
        }
    }
    // 读取结束后存入最后一个未处理的单词
    if (!currentWord.empty()) {
        strVec.push_back(currentWord);
    }
    file.close();
}

// 若必须使用原生动态数组可按如下逻辑转换,使用完成后记得delete[] strSet避免内存泄漏
std::string* strSet = new std::string[strVec.size()];
for (size_t i = 0; i < strVec.size(); i++) {
    strSet[i] = strVec[i];
}
效果验证

针对你给出的示例I am(两个单词中间3个空格),代码处理后的存储结果为:

strVec[0] = "I"
strVec[1] = " "
strVec[2] = " "
strVec[3] = " "
strVec[4] = "am"

完全符合单个空格单独存储的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:06:03