为何我的代码从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
相关产品推荐
相关产品推荐

