为什么 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;
#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;