Как определить размер файла в программе на C?
Нужно выделить память, равную размеру файла в байтах, под массив байтов и затем считать файл в этот массив.
Отслеживать
задан 11 ноя 2010 в 15:36
34.5k 25 25 золотых знаков 97 97 серебряных знаков 214 214 бронзовых знаков
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Нужно использовать функцию fstat.
#include #include #include #include #include #include #include int main() < void *buffer = NULL; int descriptor = open("filename", O_RDONLY); if (descriptor != -1) < FILE *file = fdopen(descriptor, "rb"); if (file) < struct stat statistics; if (fstat(descriptor, &statistics) != -1) < buffer = (char*)malloc(statistics.st_size); >fclose(file); > close(descriptor); > if (!buffer) < free(buffer); >return 0; >
Отслеживать
ответ дан 11 ноя 2010 в 16:48
Nicolas Chabanovsky Nicolas Chabanovsky
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
C, C++
Или можно сделать fseek на конец файла. А затем ftell для получения текущего положения курсора в файле.
PS: при этом нужно быть аккуратным с файлами, размер которых превышает макс. значение для типа long. В этом случае можно воспользоваться 64-битными версиями ф-ций.
PPS: для того, чтобы ftell вернул именно размер файла, нужно его открыть в бинарном режиме.
C++ (w boost):
#include #include using namespace boost::filesystem; int main(int argc, char* argv[]) < if (argc < 2) < std::cout std::cout
Re: узнать размер файла в Си
Заметим в скобках, что на чистом ISO C узнать размер файла нельзя, по каковому вопросу см. comp.lang.c FAQ. Т.е. прием с fseek/ftell на самом деле не будет гарантированно работать на всех системах.
aa5779 ★
( 16.02.05 21:07:21 MSK )
Ответ на: Re: узнать размер файла в Си от aa5779 16.02.05 21:07:21 MSK
Re: узнать размер файла в Си
>Т.е. прием с fseek/ftell на самом деле не будет гарантированно работать на всех системах.
ВО всяком случае ISO стандарт не обещает, что ftell будет возвращать что-то разумное. :)
Размер файла
Open Watcom размер исполняемого файла
Как заставить ватком генерировать минимально возможный .com and .exe файл? Как ни пытался меньше.
Чтение из файла слова (неправильный размер)
При чтении фрагмента в переменную я указываю и получается, что из строки Иванов Иван Иванович.
Чтение текстового файла без ограничения на размер
есть функция, которая осуществляет открытие и чтение текстового файла. функция возвращает.
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380

Сообщение было отмечено DanZ как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include long int filesize( FILE *fp ) { long int save_pos, size_of_file; save_pos = ftell( fp ); fseek( fp, 0L, SEEK_END ); size_of_file = ftell( fp ); fseek( fp, save_pos, SEEK_SET ); return( size_of_file ); } void main() { FILE *fp; fp = fopen( "file", "r" ); if( fp != NULL ) { printf( "File size=%ld\n", filesize( fp ) ); fclose( fp ); } }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Довести размер указанного файла до заданной длины
Программе задаются: имя существующего текстового файла; требуемая новая длина в байтах; символ.

Увеличить размер файла до 20, записав в начало нули
Дан файл целых чисел, содержащий менее 20 элементов. Увеличить его размер до 20 элементов, записав.
Как узнать размер массива при чтении из файла?
Доброго времени суток. Возник вопрос: как узнать размер массива при чтении из файла(имеется ввиду.
Записать в файл информацию о файлах,размер которых меньше размера последнего введенного файла
Записать в файл информацию о файлах,размер которых меньше размера последнего введенного файла.
Программирование C — Как получить размер файла?

Как оказалось, узнать размер файла в языке C - совсем нетривиальная задача. В процессе её решения как минимум вы обязательно столкнетесь с переполнением целочисленного типа данных. В данной статье я приведу 4 способа получения размера файла с использованием функций из стандартной библиотеки C, функций из библиотеки POSIX и функций из библиотек Windows.
Способ 1: решение "в лоб" (скомпилируется везде, но работает очень долго)
Мы просто откроем файл в бинарном режиме и в цикле считаем из него байт за байтом.
#include
#include
int64_t getFileSize ( const char * file_name ) <
int64_t _file_size = 0 ;
FILE * fd = fopen ( file_name , "rb" ) ;
if ( fd == NULL ) <
_file_size = - 1 ;
while ( getc ( fd ) != EOF )
_file_size ++ ;
fclose ( fd ) ;
return _file_size ;
#define FILE_PATH "some_file.txt"
int64_t file_size = getFileSize ( FILE_PATH ) ;
printf ( "File size: %" PRId64 "\n" , file_size ) ;
Очевидным недостатком способа является скорость работы. Если у нас файл будет на много гигабайт, то только размер файла будет считаться относительно долго (это сколько байт то надо считать?), а надо же еще остальную программу выполнять.
Достоинство такого способа - работать должен на любой платформе. Ну и конечно можно ускорить процесс за счет считывания бОльшего количества байт.
Способ 2: с использованием функций fseek и ftell (ограничен для объемных файлов и работает не всегда верно)
Данный способ основан на использовании функций стандартной библиотеки C: fseek и ftell. Что происходит - открываем файл в бинарном режиме, перемещаем внутренний указатель положения в файле сразу в конец с помощью fseek, получаем номер последнего байта с помощью ftell.
#include
#include
int64_t getFileSize ( const char * file_name ) <
int64_t _file_size = 0 ;
FILE * fd = fopen ( file_name , "rb" ) ;
if ( fd == NULL ) <
_file_size = - 1 ;
fseek ( fd , 0 , SEEK_END ) ;
_file_size = ftello ( fd ) ;
fclose ( fd ) ;
return _file_size ;
#define FILE_PATH "some_file.txt"
int64_t file_size = getFileSize ( FILE_PATH ) ;
printf ( "File size: %" PRId64 "\n" , file_size ) ;
Проблем у данного способа несколько.
Первое - это возвращаемый тип функции ftell. У разных компиляторов на разных платформах по разному. Если у вас 32х битная система, то данный способ будет работать только для файлов, размером меньше 2048 Мб, поскольку максимальное значение для возвращаемого функцией типа long там будет 2147483647. На системах с большей разрядностью будет работать лучше, из-за большего значения максимума для long. Но подобная нестабильность будет мешать. Хотя у меня на 64х битой системе на компиляторе gcc данный способ для файлов больше 8 Гб выводил некорректные значения.
Второе - гарантированность работы fseek и ftell. Коротко говоря, на разных платформах работает по-разному. Где то будет точно возвращать значение положения последнего байта, где то будет возвращать неверное значение. То есть точность данного способа негарантированна.
Плюсом является то, что эти функции из стандартной библиотеки - скомпилируется почти везде.
Стоит сказать, что хитрые инженеры из Microsoft придумали функции _fseeki64 и _ftelli64, которые, как понятно из их названия, работают с int64, что решает проблему с размером файла в MSVC под Windows.
Способ 3: (под Linux (POSIX))
Данный способ основан на использовании системном вызове fstat с использованием специальной структуры struct stat. Как работает: открываем файл через open() или fopen(), вызываем fstat для дескриптора файла (если открыли через fopen, то в fstat надо положить результат fileno от указателя потока FILE), указав на буферную структуру для результатов, и получаем значения поля буферной структуры st_size.