C ++:获取不正确的文件大小

时间:2010-02-17 16:44:06

标签: c++ linux

我正在使用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引起的。至少那似乎已经为我解决了。感谢所有帮助过的人。

4 个答案:

答案 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是否可能实际报告文件在磁盘上占用的字节数,而不是实际大小?这可以解释为什么它略高一些。