【问题标题】:C++ replace data in binary file with fstreamC ++用fstream替换二进制文件中的数据
【发布时间】:2019-04-24 03:01:30
【问题描述】:

我尝试使用 C++ 和 fstream 库替换二进制文件中的数据。这个库可以做到这一点吗? 我想将地址:0xB07 中的一个字节文件更改为 1。

我写了如下代码sn-p:

...

int address = 0xB07;
char * toChange = new char('0');

std::ifstream input(filename, std::ios::binary);
input.seekg(address);
input.read(toChange, 1);
input.close();

*toChange = (char)0x01;

std::ofstream output(filename, std::ios::binary);
output.seekp(address);
output.write(toChange, 1);
output.close();

...

我已经尝试了许多版本的这段代码,但我仍然无法理解为什么字节没有改变。

【问题讨论】:

  • 由于您没有提供我们可以自己尝试的Minimal, Complete, and Verifiable example,因此我们仅限于您的描述。那么“它不起作用”是什么意思?你收到一些错误信息吗?有什么意想不到的事情发生? (这是什么?)
  • 对不起。 “它不起作用”意味着字节没有被替换。例如,我可以在十六进制编辑器中检查它们。
  • 尝试在写入部分添加错误检查。也许该文件实际上不可写?至少它会告诉你哪个部分失败了。
  • 我希望我的问题现在更好了。如何添加错误检查?我试图检查 output.bad() 但它返回 false。
  • ofstream 构造函数会失败吗?它如何表示失败?检查它。 seekp 会失败吗?它是如何...(等)要回答如何,请查看参考cplusplus.com/reference/fstream/ofstream

标签: c++ fstream binaryfiles istream


【解决方案1】:

此代码将删除您的文件并在其中放入全新的内容。 问题出在一行

std::ofstream output(filename, std::ios::binary);

那是因为默认打开模式是ios::out | ios::trunc(例如:Input/Output with files) 这意味着文件被截断为零字节。

然后你的 seek() 函数将他扩展到指定的大小(通常用零填充),最后 output.write() 在末尾写入字节。

为了做你想做的事,我必须指定以下 ofstream 标志:std::ios::binary|std::ios::out|std::ios::in

目前我无法确定为什么需要 std::ios::in,抱歉...

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多