Как определить размер файла в C?

Как узнать размер файла в байтах?

#include unsigned int fsize(char* file){ //what goes here? } 

9X_io

159
1

  • Почему `char * file`, почему не` FILE * f ...
9
Общее количество ответов: 9

Ответ #1

Ответ на вопрос: Как определить размер файла в C?

На основе кода NilObject:

#include #include off_t fsize(const char *filename) { struct stat st; if (stat(filename, &st) == 0) return st.st_size; return -1; } 

Изменения:

  • Сделал аргумент имени файла const char.
  • Исправлено определение struct stat, в котором отсутствовало имя переменной.
  • Возвращает -1 при ошибке вместо 0, что было бы неоднозначно для пустого файла. off_t — знаковый тип, поэтому это возможно.

Если 9X_file вы хотите, чтобы fsize() распечатывал сообщение 9X_io об ошибке, вы можете использовать это:

#include #include #include #include #include off_t fsize(const char *filename) { struct stat st; if (stat(filename, &st) == 0) return st.st_size; fprintf(stderr, "Cannot determine size of %s: %s\n", filename, strerror(errno)); return -1; } 

В 9X_input-output 32-битных системах вы должны скомпилировать 9X_file это с опцией -D_FILE_OFFSET_BITS=64, иначе off_t будет содержать только 9X_input-output значения до 2 ГБ. Подробнее см. в разделе 9X_input-output «Использование LFS» в Large File Support in Linux.

168
4

  • * Для более переносимого кода используйте `fseek` +` ftell`, как было предложено Дереком. * Нет. [Стандарт C] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/ n1256.pdf) конкретно ...

Ответ #2

Ответ на вопрос: Как определить размер файла в C?

Не используйте int. Файлы размером более 2 9X_filesize гигабайт в наши дни распространены как грязь

Не 9X_file используйте unsigned int. Файлы размером более 4 гигабайт 9X_c встречаются часто, как немного менее распространенная 9X_c грязь

Стандартная библиотека IIRC определяет 9X_input-output off_t как беззнаковое 64-битное целое число, которое 9X_c следует использовать всем. Мы можем переопределить 9X_filesize это значение до 128 бит через несколько 9X_file лет, когда у нас начнут висеть 16-экзабайтные 9X_io файлы.

Если вы используете Windows, вам следует 9X_file использовать GetFileSizeEx — на самом деле он использует 9X_filesize 64-битное целое число со знаком, поэтому 9X_files они начнут сталкиваться с проблемами с файлами 9X_filesize размером 8 эксабайт. Глупый Майкрософт! :-)

79
2

  • @ JL2210 принятый ответ от Теда Персиваля показывает решение, совместимое с posix, поэт ...

Ответ #3

Ответ на вопрос: Как определить размер файла в C?

Решение Мэтта должно работать, за исключением 9X_io того, что это C++ вместо C, и начальный 9X_c теллс не нужен.

unsigned long fsize(char* file) { FILE * f = fopen(file, "r"); fseek(f, 0, SEEK_END); unsigned long len = (unsigned long)ftell(f); fclose(f); return len; } 

Вам тоже починили скобу. ;)

Обновление: это 9X_file не лучшее решение. Он ограничен файлами 9X_io размером 4 ГБ в Windows и, вероятно, медленнее, чем 9X_input-output просто вызов для конкретной платформы, такой 9X_filesize как GetFileSizeEx или stat64.

36
2

  • И C99, и C11 возвращают long int из ftell(). Приведение `(unsigned long)` не улучшает диапазон, который уже ограничен функцией. `ftell()` возвращает -1 при ошибке, и это становится запутанным с приведением типо ...

Ответ #4

Ответ на вопрос: Как определить размер файла в C?

**Не делайте этого (why?):

Цитируя стандартный 9X_filesize документ C99, который я нашел в Интернете: «Установка 9X_files индикатора позиции файла на конец файла, как 9X_file и в случае с fseek(file, 0, SEEK_END), имеет неопределенное поведение 9X_input-output для двоичного потока (из-за возможного завершающего 9X_files нулевого символа) или для любого потока 9X_file с кодирование, зависящее от состояния, которое 9X_c не обязательно заканчивается в начальном 9X_filesize состоянии сдвига.**

Измените определение 9X_file на int, чтобы можно было передавать сообщения 9X_input-output об ошибках, а затем используйте fseek() и ftell() для 9X_input-output определения размера файла.

int fsize(char* file) { int size; FILE* fh; fh = fopen(file, "rb"); //binary mode if(fh != NULL){ if( fseek(fh, 0, SEEK_END) ){ fclose(fh); return -1; } size = ftell(fh); fclose(fh); return size; } return -1; //error } 

14
2

  • @mezhaka: Этот отчет CERT просто неверен. `fseeko` и` ftello` (или `fseek` и` ftell`, если вы застряли без первого и довольны ограничениями на размеры файлов, с которыми вы можете ра ...

Ответ #5

Ответ на вопрос: Как определить размер файла в C?

POSIX

Стандарт POSIX имеет собственный метод получения 9X_c размера файла.
Включите заголовок sys/stat.h, чтобы 9X_c использовать функцию.

Сводка

  • Получайте статистику файлов с помощью stat(3).
  • Получите свойство st_size.

Примеры

Примечание. Он ограничивает размер 9X_filesize 4GB. Если не файловая система Fat32, используйте 9X_c 64-битную версию!

#include #include int main(int argc, char** argv) { struct stat info; stat(argv[1], &info); // 'st' is an acronym of 'stat' printf("%s: size=%ld\n", argv[1], info.st_size); } 
#include #include int main(int argc, char** argv) { struct stat64 info; stat64(argv[1], &info); // 'st' is an acronym of 'stat' printf("%s: size=%ld\n", argv[1], info.st_size); } 

ANSI C (стандарт)

ANSI C не позволяет напрямую 9X_input-output определять длину файла.
Придется использовать 9X_input-output свой разум. А пока воспользуемся методом 9X_files поиска!

Сводка

  • Найдите файл до конца, используя fseek(3).
  • Получите текущую позицию с помощью ftell(3).

Пример

#include int main(int argc, char** argv) { FILE* fp = fopen(argv[1]); int f_size; fseek(fp, 0, SEEK_END); f_size = ftell(fp); rewind(fp); // to back to start again printf("%s: size=%ld", (unsigned long)f_size); } 

Если это файл stdin или pipe. POSIX, ANSI C не работают.
Он 9X_input-output вернет 0, если файл является конвейером, или 9X_filesize stdin.

Мнение: Вместо этого вам следует использовать 9X_io стандарт POSIX. Потому что он поддерживает 64-битную 9X_c версию.

11
1

  • struct _stat64 и __stat64() для _Windows.<p><span ...

Ответ #6

Ответ на вопрос: Как определить размер файла в C?

Если вас устраивает использование библиотеки 9X_c std c:

#include off_t fsize(char *file) { struct stat filestat; if (stat(file, &filestat) == 0) { return filestat.st_size; } return 0; } 

4
1

  • Это не стандартный C. Это часть стандарта POSIX, но не стандарта ...

Ответ #7

Ответ на вопрос: Как определить размер файла в C?

А если вы создаете приложение для Windows, используйте 9X_io API GetFileSizeEx, так как ввод-вывод файлов CRT запутан, особенно 9X_input-output для определения длины файла из-за особенностей 9X_file представления файлов в разных системах ;)

4
0

Ответ #8

Ответ на вопрос: Как определить размер файла в C?

Нашел a method using fseek and ftell и ветку с этим вопросом с ответами, что 9X_input-output на просто C это нельзя сделать по-другому.

Вы 9X_input-output можете использовать библиотеку переносимости, такую 9X_files ​​как NSPR (библиотека, на которой работает 9X_filesize Firefox).

3
0

Ответ #9

Ответ на вопрос: Как определить размер файла в C?

Я использовал этот набор кода, чтобы определить 9X_filesize длину файла.

//opens a file with a file descriptor FILE * i_file; i_file = fopen(source, "r"); //gets a long from the file descriptor for fstat long f_d = fileno(i_file); struct stat buffer; fstat(f_d, &buffer); //stores file size long file_length = buffer.st_size; fclose(i_file); 

2
0