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