C++按行读写文件筛选含指定子串行 while循环遇换行不终止问题问询
问题原因分析
- 第一个问题:C++中使用
>>流运算符读取字符串时,会默认跳过所有空白分隔符(包括空格、换行符\n、制表符\t等),因此你永远无法通过file >> word2读取到换行符,word2 != enterKey的终止条件永远不会触发,导致循环不会在换行位置停止。 - 第二个问题:你的代码是按单个单词读取文本,而非按行读取,同时你判断的是单个单词完全匹配关键词,而非判断整行包含给定子串,自然无法从行起始位置开始处理整行内容。
修正后实现代码
#include <iostream> #include <fstream> #include <string> using namespace std; int main(){ ifstream inputFile; ofstream outputFile; string inputFileName = "inputFile.txt"; string keyWord = "morning"; string currentLine; // 打开已存在的输入文件 inputFile.open(inputFileName); if (!inputFile.is_open()) { cout << "输入文件打开失败" << endl; return 1; } // 创建输出文件 outputFile.open("outputFile.txt"); if (!outputFile.is_open()) { cout << "输出文件打开失败" << endl; inputFile.close(); return 1; } // 按行读取输入文件,自动在换行位置终止单次读取 while (getline(inputFile, currentLine)) { // 判断当前行是否包含目标子串 if (currentLine.find(keyWord) != string::npos) { // 将整行写入输出文件,保留原始换行格式 outputFile << currentLine << endl; } } // 释放文件资源 inputFile.close(); outputFile.close(); return 0; }
实现说明
- 采用
getline()函数按行读取输入文件,完全符合需求中「文件读取需按行执行」的要求,不需要手动判断换行符,函数读取到行尾(遇到换行符)时会自动终止本次读取 - 使用
string类的find()方法判断行中是否包含目标子串,只要子串存在就将整行写入输出文件,匹配逻辑符合需求 - 新增了文件打开失败的异常判断,避免文件不存在时程序无响应的问题
内容的提问来源于stack exchange,提问作者Robert Kovalauskis
相关产品推荐
相关产品推荐

