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

为何我的代码从w10_text.dat文件分配了不必要的字节数?(OOP345 圣尼嘉学院)

问题原因分析

你的backup方法之所以会写出不必要的字节,核心问题出在文件打开模式和写入方式上,具体来说有这两个关键点:

  • 错误使用文本模式打开二进制文件
    你现在打开文件用的是std::ios::out,这是默认的文本模式。在Windows系统下,文本模式会自动把换行符'\n'转换成'\r\n'(回车+换行),这就意味着每遇到一个'\n',写入的字节数就会比原数据多1个。如果你的text数组里包含多个换行符,累计下来就会多出不少不必要的字节。

  • 使用流插入运算符<<处理二进制数据
    <<运算符是为文本输出设计的,它会对一些特殊字符做额外处理,比如遇到'\0'(空字符)可能会提前终止输出,或者对其他控制字符做转义,这都会导致写入的内容和原始text数组的字节数不一致,要么多写要么少写,不符合二进制备份的需求。

修复方案

要解决这个问题,你需要改成二进制模式打开文件,并用二进制方式写入:

void SecureData::backup(const char* file) {
    if (!text) 
        throw std::string("\n***No data stored***\n");
    else if (!encoded) 
        throw std::string("\n***Data is not encoded***\n");
    else {
        // 以二进制写入模式打开文件
        std::ofstream os(file, std::ios::out | std::ios::binary);
        if (!os.is_open()) {
            throw std::string("\n***No file could be opened " + std::string(file) + " ***\n");
        } else {
            // 直接写入整个二进制数据块,更高效且准确
            os.write(text, nbytes);
        }
    }
}

这里做了两个关键修改:

  • 打开文件时加上std::ios::binary标志,强制使用二进制模式,避免系统对换行符等字符的自动转换。
  • 用os.write()替代循环的<<操作,直接写入nbytes个字节的原始数据,保证写入的字节数和text数组的实际长度完全一致,同时效率也更高。

内容的提问来源于stack exchange,提问作者Sebastian Djurovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:47:28