我正在使用Linux和C ++。我有一个大小为210732字节的二进制文件,但使用seekg / tellg报告的大小为210728。
我从ls-la获得以下信息,即210732字节:
-rw-rw-r-- 1 pjs pjs 210732 Feb 17 10:25 output.osr
使用以下代码片段,我得到210728:
std::ifstream handle;
handle.open("output.osr", std::ios::binary | std::ios::in);
handle.seekg(0, std::ios::end);
std::cout << "file size:" << static_cast<unsigned int>(handle.tellg()) << std::endl;
所以我的代码关闭了4个字节。我已使用十六进制编辑器确认文件的大小是正确的。那么为什么我没有得到正确的尺寸?
我的回答:我认为这个问题是由于文件中有多个开放的fstream引起的。至少那似乎已经为我解决了。感谢所有帮助过的人。
答案 0 :(得分:9)
为什么要打开文件并检查大小?最简单的方法是这样做:
#include <sys/types.h> #include <sys/stat.h> off_t getFilesize(const char *path){ struct stat fStat; if (!stat(path, &fStat)) return fStat.st_size; else perror("file Stat failed"); }
编辑:感谢 PSJ 指出一个小错字故障...... :)
答案 1 :(得分:3)
至少对于我在64位CentOS 5上使用G ++ 4.1和4.4,下面的代码按预期工作,即程序打印出的长度与stat()调用返回的长度相同。
#include <iostream>
#include <fstream>
using namespace std;
int main () {
int length;
ifstream is;
is.open ("test.txt", ios::binary | std::ios::in);
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
cout << "Length: " << length << "\nThe following should be zero: "
<< is.tellg() << "\n";
return 0;
}
答案 2 :(得分:2)
当谈到Unix的味道时,为什么我们在使用stat utlilty
时会使用它long findSize( const char *filename )
{
struct stat statbuf;
if ( stat( filename, &statbuf ) == 0 )
{
return statbuf.st_size;
}
else
{
return 0;
}
}
如果没有,
long findSize( const char *filename )
{
long l,m;
ifstream file (filename, ios::in|ios::binary );
l = file.tellg();
file.seekg ( 0, ios::end );
m = file.tellg();
file.close();
return ( m – l );
}
答案 3 :(得分:1)
ls -la是否可能实际报告文件在磁盘上占用的字节数,而不是实际大小?这可以解释为什么它略高一些。