C++读取文件时如何将连续空格分别作为单独单词存储
问题原因分析
你当前使用的std::ifstream的>>流提取运算符默认会跳过所有空白字符(空格、换行、制表符等),连续的空格会被直接忽略不会读入到string对象中,这是代码不符合需求的核心原因。
调整方案
要实现单个空格单独作为元素存储,需要逐个字符读取文件内容,手动区分普通字符和空格分别处理:
- 遇到非空格字符时,暂存到临时字符串中,攒成完整的非空格单词
- 遇到空格字符时:
- 如果临时字符串不为空,先把临时字符串作为一个元素存入容器,清空临时字符串
- 把当前单个空格作为单独元素存入容器
- 整个文件读取完成后,检查临时字符串是否还有未存储的内容,把最后一个非空格单词存入容器
完整调整代码
这里优先使用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
相关产品推荐
相关产品推荐

