VS2017下C++ writeFile中getline指定'-'分隔符触发无限循环问题
问题描述
代码可在VS 2017环境下正常编译运行,但writeFile()函数存在非预期行为:程序会持续读取分隔符'-'之后的输入内容。经测试readFile()函数运行正常,但writeFile()执行时会进入无限循环,初步推测问题由while (getline(cin, holdLine, '-'))循环导致。
完整问题代码如下:
#include <iostream> #include <fstream> #include <string> using namespace std; void writeFile(fstream& file) { file.open("writing.txt", ios::out); if (file.is_open()) { string holdLine; cout << "Please write to the file from console!!!" << endl; while (getline(cin, holdLine, '-')) file << holdLine<< endl; } file.close(); } void readFile(fstream& file) { file.open("writing.txt", ios::in); if (file.is_open()) { string holdLine; while (getline(file, holdLine)) { cout << holdLine << endl; } } file.close(); } int main() { fstream sampleFile; writeFile(sampleFile); readFile(sampleFile); }
问题根因
问题出在对getline三参数重载版本的逻辑理解偏差,当前循环本身就不会在遇到第一个'-'时终止:
- 三参数
getline(输入流, 存储字符串, 分隔符)的执行逻辑是:持续从流中读取字符,直到读到指定分隔符或者*到达流末尾(EOF)*才结束本轮读取;读到分隔符时,会直接将分隔符从流中丢弃,仅把分隔符前的内容存入目标字符串,不会跳出外层while循环。 - 把
'-'设为分隔符后,默认的换行符不再是读取终止标记:只要输入流没有触发EOF,每读到一个'-',循环就会把前面的内容写入文件,然后立刻启动下一轮读取,继续获取'-'后面的内容,表现出来就是持续读取不停止,和“遇到'-'就终止输入”的预期完全不符。
修复方案
根据实际需求二选一即可:
- 需求:输入遇到第一个
'-'就终止读取,仅写入'-'之前的内容到文件
不要把'-'作为getline的分隔符参数,改为正常按换行符读取,每读一行单独检查是否存在'-',找到标记就截断内容、退出循环。修复后的writeFile代码如下,注意需要额外引入<limits>头文件支持流清理逻辑:#include <limits> // 新增头文件 void writeFile(fstream& file) { file.open("writing.txt", ios::out); if (file.is_open()) { string holdLine; cout << "Please write to the file from console!!!" << endl; while (getline(cin, holdLine)) { size_t splitPos = holdLine.find('-'); if (splitPos != string::npos) { file << holdLine.substr(0, splitPos) << endl; break; } file << holdLine << endl; } // 清理输入流状态,避免后续输入操作异常 cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); } file.close(); } - 需求:用
'-'作为内容分段标记,所有分段内容都写入文件,输入完成后手动终止
现有循环逻辑不需要修改,全部内容输入完成后,在Windows控制台按Ctrl+Z后回车、Linux/macOS控制台按Ctrl+D手动触发EOF标记,循环检测到流结束就会自动终止。
内容的提问来源于stack exchange,提问作者user19523629
相关产品推荐
相关产品推荐

