在 C++ 中写入现有的空白二进制文件

Posted

技术标签:

【中文标题】在 C++ 中写入现有的空白二进制文件【英文标题】:Writing to existing blank spaced binary file in C++ 【发布时间】:2013-10-25 18:35:05 【问题描述】:

我正在尝试通过 C++ 在特定位置写入大小为 1 MB 的现有空白二进制文件。

ofstream of( filename, ofstream::binary );
of.seekp(1600, of.beg);
of.write(arr, 1024);
of.close();

通过将此缓冲区写入之前的文件来创建空白文件:

char *buffer = (char*)malloc(size);     
memset(buffer, ' ', size);

但是这段代码只是截断了整个1MB的空白文件并写入了这1KB的内容,文件的大小变成了1KB。

也尝试使用appate 模式。当我尝试这样的app 模式时:

ofstream of( filename, ofstream::binary | ofstream::app );
of.seekp(1600, of.beg);
of.write(arr, 1024);
of.close();

它将内容添加到文件的末尾。因此文件大小变为 1MB+1KB。

我想要做的是用一些数据覆盖文件中的 1KB 数据(目前它是空白空间)。这样它就不会改变文件大小或任何其他数据。

我哪里做错了?

【问题讨论】:

我不是唯一一个好奇“空白二进制文件”是什么的人。我就是不能…… 对不起,如果我使用了错误的术语。我包含了上面的代码。请检查 啊..好的。所以它是一个文件,其前导的预定字节等同于平台相关空间(例如,ascii 0x20 或 ebcdic 0x40)。这更有意义。谢谢。 对于它的价值,我发现mmap(Windows 有类似的机制)在读取/更新现有文件中随机偏移的数据时非常方便。恕我直言,使用它的代码往往比使用流搜索的代码更易读。 【参考方案1】:

使用

ofstream of( filename, ofstream::binary | ofstream::in | ofstream::out)

打开二进制文件进行更新。

参见 C++11 表 123 - 文件打开模式(在 27.9.1.4/3 中):

Table 132 — File open modes

 ios_base flag combination          stdio 
binary  in   out  trunc  app       equivalent
---------------------------------------------------
              +                      "w"    truncate/create for writing
              +           +          "a"    append - writes automatically seek to EOF
                          +          "a"    
              +     +                "w"    
        +                            "r"    open for read
---------------------------------------------------
        +     +                      "r+"   open for update (reading and writing)
        +     +     +                "w+"   truncate/create for update
        +     +           +          "a+"   open or create for update - writes seek to EOF
        +                 +          "a+"
---------------------------------------------------
  +           +                      "wb"   All same as above, but in binary mode
  +           +           +          "ab"
  +                       +          "ab"
  +           +     +                "wb"
  +     +                            "rb"
---------------------------------------------------
  +     +     +                      "r+b"
  +     +     +     +                "w+b"
  +     +     +           +          "a+b"
  +     +                 +          "a+b"

【讨论】:

因为如果不这样做,文件将被截断。 迈克尔·伯尔,太棒了! :)

以上是关于在 C++ 中写入现有的空白二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

C++之文件的读取和写入操作(文本文件和二进制文件)

在 C++ 中通过迭代器将向量写入二进制文件的正确方法

将结构写入二进制文件 C++ 时遇到问题

C++怎么把文件读取成16进制的,显示出来,或者16进制的写入文件.

如何使用 C++ 覆盖二进制文件的一部分?

在 C++ 中读取 .dat 二进制文件(深度图)