Перейти к содержимому

Как узнать размер файла c

  • автор:

Как определить размер файла в программе на 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 — Как получить размер файла?

clang_slide

Как оказалось, узнать размер файла в языке C - совсем нетривиальная задача. В процессе её решения как минимум вы обязательно столкнетесь с переполнением целочисленного типа данных. В данной статье я приведу 4 способа получения размера файла с использованием функций из стандартной библиотеки C, функций из библиотеки POSIX и функций из библиотек Windows.
Способ 1: решение "в лоб" (скомпилируется везде, но работает очень долго)
Мы просто откроем файл в бинарном режиме и в цикле считаем из него байт за байтом.

#include // для int64_t
#include // для правильного вывода int64_t в printf
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 // для int64_t
#include // для правильного вывода int64_t в printf
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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *