You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:C++读取文件反转部分文本后写入另一文件的问题

我来帮你排查问题!你的代码里有几个关键疏漏,导致反转后的内容没能正确写入目标文件,咱们一步步拆解和修正:

先说说你代码里的核心问题

  1. 只保留了最后一行的反转结果
    你在循环里处理了第5到14行的反转,但每次处理完只是更新了line变量,没有把这些处理后的内容及时保存或写入文件。最后你只把循环结束时的line(也就是第14行的反转结果)写入了文件,前面9行的反转内容全丢了。

  2. eof()循环条件的陷阱
    用!par2.eof()作为循环判断条件会导致最后一行被重复读取——因为eof()只有在尝试读取超过文件末尾时才会触发,正确的做法是把getline(par2, line)直接放在循环条件里,读取失败(包括到文件尾)时会直接退出循环。

  3. 缺少文件打开检查
    如果输入/输出文件路径错误、没有读写权限,程序会默默继续执行,但实际上根本读不到内容也写不进去。加上打开检查能快速定位这类问题。

修正后的完整代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:33:29