C++嵌套while循环内层仅执行一次,如何实现输入文件每行追加所有后缀输出
问题原因分析
- 输入文件流状态错误:第一次内层
while循环执行完成后,inFile的读取指针已经走到文件末尾,同时流会被标记eof(文件结束)和fail(读取失败)状态,后续再调用getline读取inFile会直接返回false,内层循环不会触发。 - 文件提前关闭:你在外层循环末尾直接关闭了
inFile和outFile,第二次进入外层循环时,两个文件都处于关闭状态,既无法读取输入内容,也无法写入输出内容。 - 文件打开判断逻辑错误:当前判断条件用的是
&&,仅当两个文件同时打开失败才会报错,只要有一个文件打开成功程序就会继续执行,不符合预期,应改为||。
修复方案
- 移除外层循环内的
inFile.close()和outFile.close(),outFile全程保持打开状态,程序执行结束前关闭即可。 - 每次处理完一个后缀后,先调用
inFile.clear()清除流的错误标记,再调用inFile.seekg(0)将读取指针重置到文件开头,保证下一轮外层循环可以从头读取输入文件的所有内容。 - 修正文件打开的判断条件,将
&&改为||。
修正后代码
#include <iostream> #include <fstream> #include <string> #include <cstdlib> using namespace std; int main() { string line_in{}; string line_suf{}; string line_out{}; ifstream inFile{}; ofstream outFile{"outfile.txt"}; ifstream suffix{}; inFile.open("combined_test.txt"); suffix.open("suffixes.txt"); if (!inFile.is_open() || !suffix.is_open()) { perror("Error open"); exit(EXIT_FAILURE); } while (getline(suffix, line_suf)) { while (getline(inFile, line_in)) { line_out = line_in + line_suf; outFile << line_out << endl; } // 重置输入文件流状态和指针位置 inFile.clear(); inFile.seekg(0); } // 统一关闭文件 inFile.close(); outFile.close(); suffix.close(); return 0; }
内容的提问来源于stack exchange,提问作者midas_96
相关产品推荐
相关产品推荐

