Люди никогда не достигнут совершенства, пока будут оставаться людьми...
Люди добрые, подскажите такую вещь.... Оч нужно в С/С++ выяснить размер файла.
Технологии seek() и всё такое отваливаются при файлах больше чем 2^32.

Удалось найти способ такой:
  _filelengthi64(fileno(fopen("filename", "rb")));


но он работает только в VS. Подскажите какой нибудь-метод, который бы был POSIX.

Комментарии
10.02.2010 в 15:07

www.cplusplus.com/forum/windows/10853/

В гугле зобанили?)
10.02.2010 в 15:32

Люди никогда не достигнут совершенства, пока будут оставаться людьми...
Хороший юмор. Оценил.
А теперь если ВЫ внимательно вчитаетесь в вопрос, там будет написано, в чём проблема. все эти мегаспособы выдают 0 на БОЛЬШИХ файлах.
10.02.2010 в 16:23

Per anus ad astra!
Хм... У меня есть дурацкое решение - затраить считывание по байту и поставить счётчик. Как навернётся - проверяем счётчик.)
10.02.2010 в 23:48

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
Оно?
fstat
11.02.2010 в 00:04

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
Думаю, что для получения размера файла тебе надо будет умножить st_blksize на st_blocks (это поля структуры, возвращаемой fstat'ом). Потому что st_size вполне может быть четырёхбайтным знаковым целым.
11.02.2010 в 01:54

Пау-чок
Если делать seek-методом, то вместо fseek-ftell надо использовать fseeko-ftello. Ну, либо fstat'ом, что на мой взгляд несколько кошернее.

Небольшая иллюстрация использования всех этих функций и разницы в результатах. Cygwin-gcc это кушает, MinGW-gcc - нет (ругается на fseeko/ftello, и вообще у него off_t не long long, а просто long, так что и fstat не прокатит =\ Хотя, скорее всего это где-то должно подкручиваться), как там у gcc на *NIX'ах и у MSVS'овского компилятора - не знаю.

===

#include <stdio.h>
#include <sys\stat.h>

int main (int argc, char** argv){
FILE *f;
off_t size_off=0;
long size_long=0;
struct stat buf;

printf ("Size of 'long' is %i\n", sizeof(long));
printf ("Size of 'off_t' is %i\n", sizeof(off_t));

if (argc!=2){
printf("Usage: %s <FILE>",argv[0]);
return 1;
}
if (!(f = fopen(argv[1],"rb"))){
perror("Error opening file. OH SHI-- ");
return 1;
}
if (fseeko(f,0,SEEK_END)){
perror("Error seekingO file. OH SHI-- ");
fclose(f);
return 1;
}
if (-1==(size_off=ftello(f))){
perror("Error tellingO file. OH SHI-- ");
fclose(f);
return 1;
}
if (fseek(f,0L,SEEK_END)){
perror("Error seeking file. OH SHI-- ");
fclose(f);
return 1;
}
if (-1==(size_long=ftell(f))){
perror("Error telling file. OH SHI-- ");
fclose(f);
return 1;
}
if (-1==fstat(fileno(f),&buf)){
perror("Error statinf file. OH SHI-- ");
return 1;
}
fclose(f);
printf("The size of \"%s\" is:\nIn 'long':\t\t%li bytes\nIn 'off_t':\t\t %lli bytes\n",argv[1],size_long,size_off);

printf("\n\nfstat says \"%s\" is %lli byte long", argv[1],buf.st_size);
return 0;
}

===
11.02.2010 в 06:24

>#include
>sys

а оно разве не ланакци\юних онли?

вообще похоже самый простой вариант оба способа запихать в функцию-макрос на ifdef'ах, которая будет выбирать нужный вариант под платформу. если религия позволяет. кеке
11.02.2010 в 16:28

Пау-чок
slackovod Присутствует.

Кстати:




Function

Required header


Compatibility

_fstat

<sys/stat.h> and <sys/types.h>



Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_fstat32

<sys/stat.h> and <sys/types.h>



Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_fstat64

<sys/stat.h> and <sys/types.h>



Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_fstati64

<sys/stat.h> and <sys/types.h>



Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_fstat32i64

<sys/stat.h> and <sys/types.h>



Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_fstat64i32

<sys/stat.h> and <sys/types.h>



Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003





Источник: msdn.microsoft.com/en-us/library/221w8e43%28VS....