Как определить размер файла в C?
Как узнать размер файла в байтах?
#include unsigned int fsize(char* file){ //what goes here? }
9X_io
- Почему `char * file`, почему не` FILE * f ...
Ответ #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.
- * Для более переносимого кода используйте `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 эксабайт. Глупый Майкрософт! :-)
- @ 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
.
- И 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 }
- @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_filesizestdin
.Мнение: Вместо этого вам следует использовать 9X_io стандарт POSIX. Потому что он поддерживает 64-битную 9X_c версию.
- 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; }
- Это не стандартный C. Это часть стандарта POSIX, но не стандарта ...
Ответ #7
Ответ на вопрос: Как определить размер файла в C?
А если вы создаете приложение для Windows, используйте 9X_io API GetFileSizeEx, так как ввод-вывод файлов CRT запутан, особенно 9X_input-output для определения длины файла из-за особенностей 9X_file представления файлов в разных системах ;)
Ответ #8
Ответ на вопрос: Как определить размер файла в C?
Нашел a method using fseek and ftell и ветку с этим вопросом с ответами, что 9X_input-output на просто C это нельзя сделать по-другому.
Вы 9X_input-output можете использовать библиотеку переносимости, такую 9X_files как NSPR (библиотека, на которой работает 9X_filesize Firefox).
Ответ #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);
-
3
-
4
-
12
-
9
-
6
-
2
-
9
-
7
-
7
-
19
-
6
-
4
-
11
-
7
-
5
-
7
-
3
-
9
-
4
-
11
-
3
-
5
-
7
-
3
-
11
-
6
-
6
-
7
-
3
-
3
-
20
-
5
-
2
-
5
-
2
-
11
-
6
-
4
-
2
-
2
-
3
-
2
-
4
-
4
-
1
-
1
-
3
-
6
-
3
-
2