std::ofstream 是将顺序数据写入磁盘还是仅使用磁盘的空闲 space?

Does std::ofstream write sequential data to disk or does it only use the disk's free space?

假设我想使用 ofstream 创建一个全 1 的 1 GB 二进制文件。并且为了争论起见,我将要在其上创建此文件的特定驱动器非常碎片化,并且磁盘上只剩下 1 GB 的可用空间 space。这是它的外观的基本示例:

#include <fstream>
#include <cstdint>

int main (int argv, char *argc[])
{
    int length_of_file = 1073741823; // 1024^3 - 1 bytes
    uint8_t data_block = 0xff;

    std::ofstream os;
    os.open("C:\foo.bin", std::ios::trunc | std::ios::binary);

    while (os.is_good()) {
        for (int i = 0; i < length_of_file; ++i) {
            os.write(data_block, sizeof(uint8_t));
        }
    }

    os.close();
    return 0;
}

这应该将 1 GB 的 1 写入文件 "foo.bin",但是如果 ofstream 将顺序数据写入驱动器,那么这将用 1 覆盖磁盘上的文件。

所以我的问题是:这种方法会覆盖硬盘中的任何文件吗?

不,此方法不会覆盖硬盘驱动器上的任何文件(C:\foo.bin 除外)。 OS 确保您的文件是独立的。您很可能会在 运行 期间遇到错误,其中磁盘驱动器抱怨 运行ning out of space 并且您的驱动器几乎已满。

请注意,您构建循环的方式有点奇怪,可能不是您想要的。您可能想消除外循环并将对 os.is_good() 的调用移至内循环:

for (int i = 0; os.is_good() && i < length_of_file; ++i) {
  os.write(data_block, sizeof(uint8_t));
}