求助:C++读取文件反转部分文本后写入另一文件的问题
我来帮你排查问题!你的代码里有几个关键疏漏,导致反转后的内容没能正确写入目标文件,咱们一步步拆解和修正:
先说说你代码里的核心问题
只保留了最后一行的反转结果
你在循环里处理了第5到14行的反转,但每次处理完只是更新了line变量,没有把这些处理后的内容及时保存或写入文件。最后你只把循环结束时的line(也就是第14行的反转结果)写入了文件,前面9行的反转内容全丢了。eof()循环条件的陷阱
用!par2.eof()作为循环判断条件会导致最后一行被重复读取——因为eof()只有在尝试读取超过文件末尾时才会触发,正确的做法是把getline(par2, line)直接放在循环条件里,读取失败(包括到文件尾)时会直接退出循环。缺少文件打开检查
如果输入/输出文件路径错误、没有读写权限,程序会默默继续执行,但实际上根本读不到内容也写不进去。加上打开检查能快速定位这类问题。
修正后的完整代码
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { // 打开输入文件并检查是否成功 ifstream par2("C:/fajllat/f1.bin", ios::in); if (!par2.is_open()) { cerr << "Error: 无法打开输入文件!" << endl; return 1; } // 打开输出文件并检查是否成功 ofstream mbrapsht("C:/fajllat/f3.bin", ios::out); if (!mbrapsht.is_open()) { cerr << "Error: 无法打开输出文件!" << endl; par2.close(); return 1; } string line; int line_num = 0; // 把getline放在循环条件里,避免eof判断的坑 while (getline(par2, line)) { line_num++; // 仅处理第5到14行的反转 if (line_num >= 5 && line_num <= 14) { line = string(line.rbegin(), line.rend()); } // 把每一行(不管是否反转)写入输出文件 mbrapsht << line << endl; } // 显式关闭文件(程序结束时会自动关闭,显式关闭更规范) par2.close(); mbrapsht.close(); return 0; }
额外说明
如果你只想把反转后的第5-14行写入目标文件(不需要保留其他行),只需要把写入语句移到if判断块里即可:
if (line_num >= 5 && line_num <= 14) { line = string(line.rbegin(), line.rend()); mbrapsht << line << endl; // 仅写入反转后的行 }
内容的提问来源于stack exchange,提问作者user9732895
相关产品推荐
相关产品推荐

