С++: получение неправильного размера файла

Я использую Linux и С++. У меня есть двоичный файл размером 210732 байт, но размер, указанный при поискеg/tellg, - 210728.

Получаю следующую информацию из ls-la, т.е. 210732 байта:

-rw-rw-r-- 1 pjs pjs 210732 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 байта. Я подтвердил, что размер файла правильный с шестнадцатеричным редактором. Так почему я не получаю правильный размер?

Мой ответ: Я думаю, проблема была вызвана наличием нескольких открытых файлов для файла. По крайней мере, похоже, это разобрало меня. Спасибо всем, кто помог.

Ответ 1

По крайней мере, для меня с g++ 4.1 и 4.4 на 64-битном CentOS 5 приведенный ниже код работает, как ожидается, то есть длина, которую программа распечатывает, такая же, как и возвращаемая вызовом 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

Почему вы открываете файл и проверяете размер? Самый простой способ - сделать это примерно так:

#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 за то, что указали незначительный опечаток...:)

Ответ 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 фактически сообщает количество байтов, которые файл занимает на диске, а не его фактический размер? Это объясняет, почему оно немного выше.