C ++: получение неверного размера файла - PullRequest
10 голосов
/ 17 февраля 2010

Я использую Linux и C ++. У меня есть двоичный файл размером 210732 байта, но размер, указанный с seekg / 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 байта. Я подтвердил, что размер файла правильный с помощью шестнадцатеричного редактора. Так почему я не получаю правильный размер?

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

Ответы [ 4 ]

9 голосов
/ 17 февраля 2010

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

#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 голосов
/ 17 февраля 2010

По крайней мере, для меня с 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 голосов
/ 18 февраля 2010

Когда на вкус Unix, почему мы используем это, когда у нас есть статус 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 );
}
1 голос
/ 17 февраля 2010

Возможно ли, что ls -la на самом деле сообщает о количестве байтов, которые файл занимает на диске, вместо его реального размера? Это объясняет, почему оно немного выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...