Как определить размер файла в 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 поиска!
Сводка
Пример
#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