C++ 使用std::ios::ate获取文件大小?

C++ 使用std::ios::ate获取文件大小?,c++,file,size,fstream,standard-library,C++,File,Size,Fstream,Standard Library,有关如何测量文件大小的几个主题(请参见和)计算文件开头和结尾之间的差异,如下所示: std::streampos fileSize( const char* filePath ){ std::streampos fsize = 0; std::ifstream file( filePath, std::ios::binary ); fsize = file.tellg(); file.seekg( 0, std::ios::end ); fsize =

有关如何测量文件大小的几个主题(请参见和)计算文件开头和结尾之间的差异,如下所示:

std::streampos fileSize( const char* filePath ){

    std::streampos fsize = 0;
    std::ifstream file( filePath, std::ios::binary );

    fsize = file.tellg();
    file.seekg( 0, std::ios::end );
    fsize = file.tellg() - fsize;
    file.close();

    return fsize;
}
std::streampos fileSize( const char* filePath ){

    std::ifstream file( filePath, std::ios::ate | std::ios::binary );
    std::streampos fsize = file.tellg();
    file.close();

    return fsize;
}
但是,我们不必在开始时打开文件,而是可以在结束时打开它,然后采取如下措施:

std::streampos fileSize( const char* filePath ){

    std::streampos fsize = 0;
    std::ifstream file( filePath, std::ios::binary );

    fsize = file.tellg();
    file.seekg( 0, std::ios::end );
    fsize = file.tellg() - fsize;
    file.close();

    return fsize;
}
std::streampos fileSize( const char* filePath ){

    std::ifstream file( filePath, std::ios::ate | std::ios::binary );
    std::streampos fsize = file.tellg();
    file.close();

    return fsize;
}

行吗?如果不是,原因是什么?

它应该可以正常工作。C++标准讲述了关于<代码> STD::IO::ATE< /COD> < /P>
ate
-打开并在打开后立即寻求结束


当手动打开然后搜索成功时,没有理由失败。而且
tellg
在这两种情况下都是一样的。

它应该可以正常工作。C++标准讲述了关于<代码> STD::IO::ATE< /COD> < /P>
ate
-打开并在打开后立即寻求结束


当手动打开然后搜索成功时,没有理由失败。而
tellg
在这两种情况下都是一样的。

只是一个旁注,对
close
的调用是不必要的。可能会起作用,但不确定这是获得文件大小的最佳方法。我通常如果需要获得文件大小,只需按如下方式进行调用:
std::ifstream file(filepath,std::ios::ate | std::ios::binary)
int fileLength=0
file.seekg(0,std::ios::end)
fileLength=file.tellg()
file.seekg(0,std::ios::beg)
if(fileLength=-1){//error stuff here}
等等。我相信流的位置不同,因为它是一个内部字符数组,所以位置1可以是偏移量0。不过,这一部分我并不乐观about@SethCarnegie:为什么关闭调用是不必要的?因为
ifstream
是一个RAII对象,当文件被销毁时会关闭它。顺便说一句,对
close
的调用是不必要的。可能会起作用,不过,我不确定这是获取文件大小的最佳方法。我通常如果需要获取文件大小,只需按如下方式调用:
std::ifstream file(filepath,std::ios::ate | std::ios::binary)
int fileLength=0
file.seekg(0,std::ios::end)
fileLength=file.tellg()
file.seekg(0,std::ios::beg)
if(fileLength=-1){//error stuff here}
等等。我相信流的位置不同,因为它是一个内部字符数组,所以位置1可以是偏移量0。不过,这一部分我并不乐观about@SethCarnegie:为什么关闭调用是不必要的?因为
ifstream
是一个RAII对象,它在文件被销毁时关闭文件。