【问题标题】:C++: Getting incorrect file sizeC++:获取不正确的文件大小
【发布时间】:2010-02-17 16:44:06
【问题描述】:

我正在使用 Linux 和 C++。我有一个大小为 210732 字节的二进制文件,但使用 seekg/tellg 报告的大小为 210728。

我从 ls-la 得到以下信息,即 210732 字节:

-rw-rw-r-- 1 pjs pjs 210732 Feb 17 10:25 output.osr

使用以下代码 sn-p,我得到 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 个字节。我已经用十六进制编辑器确认文件的大小是正确的。那么为什么我没有得到正确的尺寸呢?

我的回答:我认为问题是由于文件中有多个打开的 fstreams 引起的。至少这似乎已经为我解决了。感谢所有提供帮助的人。

【问题讨论】:

  • 所有文件系统都是这种情况(如果您有多个)?
  • 很遗憾,我无法在不同的文件系统上进行测试。
  • 在我的 32 位 Ubuntu 系统上运行良好。你用g++吗?
  • 我用的是g++ 4.1.2,系统是64位CentOS。
  • 我刚刚在带有 g++ 4.4.2 的 32 位 ArchLinux 系统上尝试过,它也给出了错误的答案。

标签: c++ linux


【解决方案1】:

为什么要打开文件并检查大小?最简单的方法是这样做:

#include #include off_t getFilesize(const char *path){ 结构统计 fStat; if (!stat(path, &fStat)) return fStat.st_size; else perror("文件统计失败"); }

编辑:感谢 PSJ 指出一个小错字... :)

【讨论】:

  • 可能是因为它没有回答问题
  • @Neil:哦...他谈到打开文件并寻找到最后以获取大小并返回不正确的结果...我想知道为什么不使用这个函数代替必须打开/关闭文件...?
  • 谢谢,我打开文件来解析它,所以我可以检查它是否包含正确的数据。我已经尝试了上述方法,但它也给出了错误的答案。还有一个 const char* 参数不应该是 stat 而不是 fstat?
【解决方案2】:

至少对于我在 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;
}

【讨论】:

  • 谢谢。令人惊讶的是,这实际上给了我正确的答案。我不明白为什么,但它确实为我提供了我正在寻找的结果。
  • 但那是完全相同的代码——除了静态转换为无符号整数之外
  • 是的,我一定在某个地方有什么东西,那就是干扰。我正在努力解决。
  • @pm100:是的。我主要想验证 centos 5 x86_64 中 g++ 4.1 和 4.4 的 libstdc++ 不包含如此明显的错误。相反,OP 的系统有些可疑。
  • 我认为这一定是由于文件打开了多个 fstream 造成的。
【解决方案3】:

当我们使用 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 );
}

【讨论】:

    【解决方案4】:

    ls -la 是否可能实际报告文件在磁盘上占用的字节数,而不是实际大小?这可以解释为什么它略高。

    【讨论】:

    • 这也是我的想法。我自己生成文件,并将 210732 字节放入文件中,当我使用 ghex2 检查文件时,它实际上包含所有字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多