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

C++ ofstream使用std::ios::binary模式写入文件仍为明文问题求助

问题排查与解决方案

核心问题:对std::ios::binary的作用理解有误

std::ios::binary仅用于关闭流的文本模式适配行为(例如Windows系统下换行符\n和\r\n的自动转换、特殊字符的转义处理),不会对写入的原始字节数据做任何编码、加密或者转换操作。你当前写入的就是原明文的ASCII字节,所以打开后自然还是明文内容,和是否加std::ios::binary无关。

实现“人类无法直接识别”的方案

如果需要输出内容不可直接阅读,需要对原始明文数据做转换处理,常见的轻量实现是对每个字节做固定密钥的异或运算,读取时用相同密钥再次异或即可还原原始数据。

代码优化与修改示例

原代码还存在可优化点:读写文件不需要逐字节循环,可直接用read()/write()方法批量操作二进制数据,同时要注意动态分配内存的释放避免泄漏。

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#define INFILE "test.txt"
#define OUTFILE "binary-output.dat"
// 自定义异或密钥,可随意修改
#define XOR_KEY 0x5A

int main(int argc, char* argv[]) {
    char* text = nullptr;
    int nbytes = 0;
    // 打开文本文件
    fstream input(INFILE, std::ios::in | std::ios::binary);
    if (!input) {
        throw "\n***Failed to open file " + string(INFILE) + " ***\n";
    }

    // 获取文件大小
    input.seekg(0, std::ios::end);
    nbytes = (int)input.tellg();
    text = new char[nbytes];

    // 批量读取文件内容
    input.seekg(ios::beg);
    input.read(text, nbytes);
    input.close();
    cout << "\n" << nbytes << " bytes copied from file " << INFILE << " into memory\n";

    if (!text || nbytes == 0) {
        delete[] text;
        throw "\n***No data stored***\n";
    } 
    
    // 对数据做异或处理
    for (int i = 0; i < nbytes; ++i) {
        text[i] ^= XOR_KEY;
    }

    // 写入二进制文件
    ofstream _file;
    _file.open(OUTFILE, std::ios::binary);
    if (!_file.is_open()) {
        delete[] text;
        throw "\n***Failed to open file***\n";
    }
    _file.write(text, nbytes);
    _file.close();
    delete[] text;

    cout << "Encrypted binary data written to " << OUTFILE << "\n";
    return 0;
}

修改后的代码对所有明文字节做了异或处理,写入的二进制文件打开后会显示为乱码,需要读取时用相同的XOR_KEY再次异或每个字节即可还原原始明文。

内容的提问来源于stack exchange,提问作者P-DoxQuad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:06:04