C++ std::ofstream是将顺序数据写入磁盘还是仅使用磁盘';什么是自由空间?

C++ std::ofstream是将顺序数据写入磁盘还是仅使用磁盘';什么是自由空间?,c++,ofstream,C++,Ofstream,假设我想创建一个包含所有1的1GB二进制文件,不管出于什么原因,使用ofstream。为了便于讨论,我将要创建此文件的特定驱动器碎片严重,磁盘上只剩下1GB的可用空间。下面是一个基本的示例,它看起来是什么样子: #include <fstream> #include <cstdint> int main (int argv, char *argc[]) { int length_of_file = 1073741823; // 1024^3 - 1 bytes

假设我想创建一个包含所有1的1GB二进制文件,不管出于什么原因,使用ofstream。为了便于讨论,我将要创建此文件的特定驱动器碎片严重,磁盘上只剩下1GB的可用空间。下面是一个基本的示例,它看起来是什么样子:

#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;
}
#包括
#包括
int main(int argv,char*argc[])
{
int length_of_file=1073741823;//1024^3-1字节
uint8数据块=0xff;
std::流操作系统;
操作系统打开(“C:\\foo.bin”,标准::ios::trunc |标准::ios::二进制文件);
while(os.is_good()){
for(int i=0;i<文件的长度;++i){
写入(数据块,大小为(uint8_t));
}
}
os.close();
返回0;
}
这会将相当于1GB的1写入文件“foo.bin”,但如果ofstream将顺序数据写入驱动器,则会用1覆盖磁盘上的文件


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

不,这个方法不会覆盖硬盘上的任何文件(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));
}
for(int i=0;os.is_good()&&i
当然,这与
std::of Stream
无关。这就是操作系统的工作方式。啊,是的,你说的循环结构不正确是对的。如果for循环没有抛出任何异常,那将是一个无限循环。。。我的错。谢谢你们两位的回复。虽然不是无限的,但不管失败与否,内部循环都会运行到1GB的倍数。外部循环可能会使您的程序写入GB的数据,直到驱动器已满。:)