std :: ofstream是否将顺序数据写入磁盘或仅使用磁盘的可用空间?

时间:2015-02-21 23:09:11

标签: c++ ofstream

假设我想使用ofstream创建1 GB的1 GB二进制文件,无论出于何种原因。并且为了争论起见,我将要创建此文件的特定驱动器严重碎片化,并且磁盘上只剩下1 GB的可用空间。这是一个基本的例子:

#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来覆盖磁盘上的文件。

所以我的问题是:此方法是否会覆盖硬盘中的所有文件?

1 个答案:

答案 0 :(得分:3)

不,此方法不会覆盖硬盘驱动器上的任何文件(C:\ foo.bin除外)。操作系统可确保您的文件是独立的。很可能你会在运行期间遇到错误,因为磁盘驱动器抱怨空间不足而你的驱动器几乎已经满了。

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

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