为什么 std::filesystem::file_size(file) 与实际文件大小不同?

Why std::filesystem::file_size(file) is differnt with real file-size?

#include<iostream>
#include<random>
#include<fstream>
#include<filesystem>

int main(){
    std::default_random_engine dre;
    std::uniform_int_distribution<> uid{ 1, 100'000 };

    std::filesystem::path file("./test.txt");

    std::unique_ptr<int[]> D{ std::make_unique<int[]>(10'000) };
    for (int i = 0; i < 10'000; ++i)
        D[i] = uid(dre);

    std::ofstream out(file, std::ios::out | std::ios::binary);
    out.write((char*)D.get(), sizeof(int) * 10'000);

    std::cout << sizeof(int) * 10'000 << std::endl;
    std::cout << std::filesystem::file_size(file) << std::endl;
    // should be same.
}

我预计结果会一样。 但是结果是

40000
36864

当我查看window中的test.txt文件时,大小为40'000。这就是我所期望的。 但是在运行时,发生了一些我无法理解的事情。为什么 std::filesystem::file_size(file) 小于实际文件大小?

std::ofstream 缓冲其输出,因此有可能(甚至可能)在您调用 file_size() 时,缓冲区中仍有 ofstream 没有的字节尚未写入实际文件。

先关闭ofstream

std::ofstream out(file, std::ios::out | std::ios::binary);
out.write((char*)D.get(), sizeof(int) * 10'000);
out.close();

std::cout << std::filesystem::file_size(file) << std::endl;

或者,至少调用 flush() 就可以了:

std::ofstream out(file, std::ios::out | std::ios::binary);
out.write((char*)D.get(), sizeof(int) * 10'000);
out.flush();

std::cout << std::filesystem::file_size(file) << std::endl;