Remarks
Функция получает сведения о файле или каталоге, указанном параметром , и сохраняет их в структуре, указанной в параметре . Функция автоматически требуемым образом обрабатывает аргументы в виде многобайтовых строк, распознавая многобайтовые последовательности символов в соответствии с текущей многобайтовой кодовой страницей.
— это версия с расширенными символами; аргумент для — строка расширенных символов. В остальных отношениях поведение функций и идентично, за исключением того, что функция does not hиle multibyte-character strings.
Варианты этих функций поддерживают 32- или 64-разрядные типы времени и 32- или 64-разрядные значения длины файлов. Первый числовой суффикс (32 или 64) указывает размер используемого типа времени; Вторым суффиксом является либо I32 , либо I64, указывающий, представлен ли размер файла как 32-разрядное или 64-разрядное целое число.
эквивалентно значению и содержит 64-разрядное время. Это справедливо, если не определено, в этом случае действует старое поведение; использует 32-разрядное время и содержит 32-бит времени. Это же справедливо и для .
Примечание
не работает с символами символьных ссылок Windows Vista. В таких случаях функция всегда возвращает размер файла, равный 0. Функция правильно работает с символьными ссылками.
Эта функция проверяет свои параметры. Если параметр или имеет значение , вызывается обработчик недопустимого параметра, как описано в .
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Типы времени и разновидности типов файлов
Функции | Определена ли директива _USE_32BIT_TIME_T? | Тип времени | Тип длины файла |
---|---|---|---|
, | Не определено | 64-разрядная | 32-разрядная версия |
, | Определено | 32-битная | 32-битная |
, | Не затрагивается определением макроса | 32-битная | 32-битная |
, | Не затрагивается определением макроса | 64-разрядная система | 64-разрядная система |
, | Не определено | 64-разрядная система | 64-разрядная система |
, | Определено | 32-разрядная версия | 64-разрядная версия |
, | Не затрагивается определением макроса | 32-разрядная версия | 64-разрядная версия |
, | Не затрагивается определением макроса | 64-разрядная | 32-разрядная версия |
Универсальное текстовое сопоставление функций
ассемблер | & не определено | определяется | определяется |
---|---|---|---|
Структура, определенная в , включает следующие поля.
Поле | Описание |
---|---|
Числовой идентификатор группы, которой принадлежит файл (только для UNIX). В системах Windows это поле всегда равно нулю. Перенаправленный файл классифицируется как файл Windows. | |
Время последнего доступа к файлу. Действительно на дисках, отформатированных в файловой системе NTFS, но не в FAT. | |
Время создания файла. Действительно на дисках, отформатированных в файловой системе NTFS, но не в FAT. | |
Номер диска, содержащего файл (то же, что и ). | |
Номер узла информации ( ) для файла (только для UNIX). В файловых системах UNIX параметр описывает отметки даты и времени файла, разрешения и содержимое. Если файлы связаны жесткими ссылками друг с другом, они имеют один и тот же параметр . Параметр и, следовательно, параметр не имеют смысла в файловых системах FAT, HPFS и NTFS. | |
Битовая маска для информации о файловом режиме. Бит устанавливается, если параметр задает каталог; бит устанавливается, если параметр задает обычный файл или устройство. Пользовательские биты чтения/записи устанавливаются в соответствии с режимом разрешений файла; пользовательские биты выполнения устанавливаются согласно расширению имени файла. | |
Время последнего изменения файла. | |
Всегда имеет значение 1 в файловых системах, отличных от NTFS. | |
Номер диска, содержащего файл (то же, что и ). | |
Размер файла в байтах; 64-разрядное целое число для вариантов с суффиксом. | |
Числовой идентификатор пользователя, который владеет файлом (только для UNIX). В системах Windows это поле всегда будет равно нулю. Перенаправленный файл классифицируется как файл Windows. |
Если параметр ссылается на устройство, поле , различные поля времени, поля и в структуре не имеют смысла. Поскольку использует тип, определенный в , необходимо включить перед в коде.
Folder Size
Очень простая программа, которая позволяет быстро определить размер выбранной вами области на жестком диске. Этот инструмент прост в использовании, но он все еще не может предоставить вам информацию о различных типов файлов, которые занимают место на вашем жестком диске. Однако вы можете просмотреть размеры для ваших наиболее часто используемых файлов, расширений и т. Д., Поскольку инструменты Windows, встроенные в него, работают очень плохо, эта программа станет настоящей находкой.
Если вы хотите узнать, сколько места занимают файлы на вашем диске, вы можете сделать это за считанные секунды, используя это программное обеспечение. Конечно, при запуске программы вы получите информацию о размере вашей системы, однако вы не увидите размер какого-либо конкретного раздела жесткого диска, на котором вы хотите проверить. Но это не помешает нам узнать о размерах различных файлов на нашем жестком диске с помощью этой программы.
Эта простая программа поможет вам определить размер некоторых из ваших файлов на вашем компьютере, если вы выберете область, которую вы хотите проанализировать.
get_time
Извлекает значение времени из потока, используя указанный формат. Возвращает значение в параметре в виде структуры времени.
Время в виде структуры времени.
Формат, используемый для получения значения времени.
Комментарии
Манипулятор возвращает объект, который при извлечении из потока ведет себя как , вызывающий функцию-член для ограничения языкового стандарта , связанного с , с использованием для указания структуры времени и для указания начала строки формата, завершающейся нулем. В случае успешного выполнения вызов хранит в структуре времени значения, связанные с полями извлеченного времени. Затем манипулятор возвращает .
Массивы структур
Работа с массивами структур аналогична работе со статическими массивами других типов данных.
Пример Библиотека из 3 книг
1234567891011121314151617181920212223242526272829303132
#include <stdio.h>#include <stdlib.h>struct book{ char title; char author; int value;};int main(){ struct book libry; int i; system(«chcp 1251»); system(«cls»); for (i = 0; i<3; i++) { printf(«Введите название %d книги : «, i + 1); gets_s(libry.title); printf(«Введите автора %d книги : «, i + 1); gets_s(libry.author); printf(«Введите цену %d книги : «, i + 1); scanf_s(«%d», &libry.value); getchar(); } for (i = 0; i<3; i++) { printf(«\n %d. %s «, i + 1, libry.author); printf(«%s %d», libry.title, libry.value); } getchar(); return 0;}
Результат выполнения
Приведение типов
Стандартом поведение при приведении одной структуры к другой не определено. Это значит, что даже если структуры имеют одинаковые поля, то нельзя явно
кастовать одну структуру до другой.
#include <conio.h> #include <stdio.h> struct Point { int x; int y; }; struct Apex { int a; int b; }; void main() { struct Point point = {10, 20}; struct Apex apex; apex = (*(struct Apex*)(&point)); printf("a = %d, b = %d", apex.a, apex.b); getch(); }
Этот пример работает, но это хак, которого необходимо избегать. Правильно писать так
void main() { struct Point point = {10, 20}; struct Apex apex; apex.a = point.x; apex.b = point.y; printf("a = %d, b = %d", apex.a, apex.b); getch(); }
Привести массив к структуре (или любому другому типу) по стандарту также невозможно (хотя в различных компиляторах есть для этого инструменты).
Но в си возможно всё.
#include <conio.h> #include <stdio.h> struct Point { int x; int y; }; void main() { struct Point point = {10, 20}; int x = {300, 400, 500}; point = (*(struct Point*)(x)); printf("a = %d, b = %d", point.x, point.y); getch(); }
Но запомните, что в данном случае поведение не определено.
Список программ
Вне зависимости от того, хотите вы разделить накопитель или планируете объединить диск, придется скачать дополнительное ПО. В данном отношении перед пользователем открывается большой выбор сложных приложений и простых утилит. Далеко не все из них можно назвать продуктивными, а уж отсутствие русского языка ставит крест на удобстве эксплуатации. Поэтому ниже представлены только хорошо зарекомендовавшие себя программы с русскоязычным интерфейсом.
Acronis Disc Director
Неплохой инструмент для разбивки, представляющий собой многофункциональное приложение с возможностью точечного управления настройками жесткого диска. После запуска Acronis Disc Director выводит на экран краткую информацию о накопителе. Вы можете отследить количество свободного места, а также выполнить сканирование на наличие ошибок.
Но нас интересует другая функция программы, которая прячется во вкладке «Действия». Здесь как раз-таки представлен инструмент разделения HDD, пользующийся особой популярностью у владельцев ПК
Причем не важно, сколько отсеков вы желаете создать. Утилита поможет сделать хоть два, хоть три, хоть четыре раздела
Paragon Partition Manager
Чуть более простое в освоении приложение, совершенно не уступающее Acronis Disc Director с точки зрения функциональности. Для создания разделов нужно перейти во вкладку «Операции с разделами», а для других действий предназначены пункты вроде «Архивирование и восстановление».
Как вы уже могли догадаться, Paragon Partition Manager предлагает широкий спектр возможностей взаимодействия с жестким диском. Сканирование поможет выявить ошибки на ранней стадии, чтобы не тратить время на дефрагментацию накопителя, а функция архивирования поможет сохранить важные документы в случае срочной необходимости переустановки Windows 10.
Aomei Partition Assistant
Продвинутый инструмент, обладающий, возможно, самым большим количеством опций для управления накопителем. Именно поэтому создатели приложения встроили «Учебник», где приводится детальная инструкция по взаимодействию с Aomei Partition Assistant, включая подробный рассказ об осуществлении разметки HDD. Кроме того, существует более привычный пункт «Справка», необходимый для уточнения базовых моментов.
На заметку. Программа представлена в версиях «Pro» и «Standart». Полноценный функционал представлен только в первой, однако деление диска доступно даже в упрощенной модификации.
Среди полезных функций, которые могут пригодиться наряду с возможностью разделения накопителя, стоит отметить опцию переноса операционной системы с одного HDD на другой без потери данных. Чтобы разобраться во всех фишках Aomei Partition Assistant, потребуется не один час свободного времени, поэтому обязательно сохраните программу после выполнения основной задачи, а затем изучите содержание «Учебника».
EaseUS Partition Master
Крайне удобный инструмент разбивания накопителя на два или более разделов. Если вы уже познакомились с ранее упомянутыми приложениями, то в освоении EaseUS Partition Master не возникнут сложности. Приложение обладает понятным интерфейсом, а вся необходимая информация по умолчанию выводится на главный экран.
Помимо нужной нам функции разделения есть возможность импорта операционной системы, как в Aomei Partition Assistant, а также опция полноценного копирования раздела, а не отдельных кластеров. Ну, и в случае, если пользователю потребуется выполнить переустановку Windows 10, он может не заморачиваться поиском еще одной программы, так как внутри EaseUS Partition Master скрывается инструмент создания загрузочной флешки.
MiniTool Partition Wizard
Заключительная в нашей подборке утилита отнюдь не является последней с точки зрения качества и функциональности. Напротив, MiniTool Partition Wizard способна конкурировать с более популярными разработками вроде Aomei Partition Assistant. Любовь продвинутых пользователей обусловлена интерфейсом, полностью переведенным на русский язык, и наличием всех необходимых опций.
Также MiniTool Partition Wizard оценят новички, для которых наличие раздела «Справка» является необходимым критерием выбора программного обеспечения. Но даже без нее понять, как выполнить разбивку, не составит труда. Просто откройте приложение, перейдите во вкладку «Раздел» и выберите опцию деления, указав требуемое количество секторов.
Как определить суммарный размер нескольких файлов и папок
Чтобы определить суммарный размер нескольких файлов и папок, можно указанным выше способом узнать размер каждого из них и затем сложить все полученные числа. В то же время, такой способ будет связан с большими затратами времени, особенно, если речь идет о значительном числе файлов.
Операционная система Windows позволяет решать подобные задачи значительно проще. Но для этого необходимо овладеть навыком выделения нескольких файлов и папок.
Самый простой способ выделить какой-нибудь файл или папку – один раз щелкнуть по нему левой кнопкой мышки .
Откройте любую имеющуюся на компьютере папку с файлами и выделите один из них указанным способом. После щелчка мышки вокруг значка выделенного файла появится специальная рамка ( см. изображение ).
Если щелкнуть по другому файлу – рамка выделения перейдет на него, а выделение с предыдущего файла автоматически снимется.
Чтобы выделение с предыдущего файла не снималось, на клавиатуре нужно постоянно удерживать нажатой кнопку «Ctrl».
То есть, чтобы выделить несколько файлов и (или) папок, необходимо нажать на клавиатуре кнопку «Ctrl» , и, не отпуская ее, поочередно один раз щелкнуть левой кнопкой мышки по каждому из них. Кнопку «Ctrl» следует отпускать, когда все необходимые файлы и папку будут выделены.
Чтобы овладеть навыком выделения нескольких файлов необходимо немного попрактиковаться, что я вам и рекомендую сделать. Подробнее основные операциях с файлами, которые можно осуществить при помощи мышки, рассмотрены в этой нашей статье.
А для того, чтобы быстро узнать суммарный размер нескольких файлов (папок), необходимо выделить их указанным выше способом, после чего щелкнуть по любому из них правой кнопкой мышки и в открывшемся контекстном меню выбрать пункт «свойства». Откроется окно, в котором будет отображаться уже обобщенная информация ( см.изображение ниже ).
На рисунке видно, что общий размер выделенных 2 файлов и 1 папки составляет 24,7 килобайт (или 25350 байт).
Ключевые советы
Гайдлайны хорошего стиля:
- используйте декомпозицию при объявлении переменных:
- в параметрах всех функций и методов вместо принимайте невладеющий по значению
- завершайте все блоки case, кроме последнего, либо атрибутом , либо инструкцией
- смело пишите
- избегайте вложенности пространств имён, а если не избежать, то объявляйте их с помощью
Гайдлайны по STL:
- предпочитайте вместо для композиции объекта T, время жизни которого короче времени жизни владельца
- используйте тип вместо enum или полиморфных классов в ситуации, когда состояния, такие как состояние лицензии, не могут быть описаны константами enum из-за наличия дополнительных данных
- используйте тип вместо enum в ситуации, когда данные, такие как код ошибки в исключении, должны быть обработаны во всех вариантах, и неполная обработка вариантов должна приводить к ошибке компиляции
- используйте тип вместо any везде, где это возможно
- предпочитайте вместо boost::filesystem
- используйте to_chars и from_chars
не используйте их напрямую: рискуете сделать небрежную обработку ошибок
для реализации библиотечных функций сериализации и парсинга чисел
- используйте std::size для измерения длины C-style массива
Возвращаемое значение
Каждая из этих функций возвращает 0, если получена информация о состоянии файла. Возвращаемое значение, равное-1, указывает на ошибку, в этом случае устанавливается в значение , указывающее, что не удалось найти имя файла или путь. Возвращаемое значение указывает на недопустимый параметр; в этом случае параметр также принимает значение .
Дополнительные сведения об этих и других кодах возврата см. в разделе ,, и .
Отметка даты в файле может быть представлена, если она позже полуночи 1-го января 1970 года и раньше 23:59:59 31-го декабря 3000 года по UTC, если только не используется функция или или не определена директива — в этом случае дата может быть представлена только до 23:59:59 18-го января 2038 года по UTC.
WinDirStat
Это бесплатное программное обеспечение — идеальное решение для людей, которым нужно проанализировать свое использование диска. Она является отличным инструментом для владельцев ноутбуков, поскольку позволяет им быстро и легко увидеть, какой из них используется лучше всего. Все, что вам нужно делать, это выбрать раздел, который вы хотите проанализировать (обычно C), и нажать на вкладку «Анализ». Программа покажет вам всю информацию о вашем жестком диске. И все это бесплатно.
Еще один плюс этой программы — она проста и понятна. В WinDirStat есть подробная информация о размере и расположении самых больших файлов на диске и об использовании каждого раздела. Вы можете использовать его в качестве инструмента инвентаризации, чтобы просмотреть, какие файлы занимают больше всего места или какие программы установлены на компьютере. Он также может предоставить вам информацию о разделе, о том, сколько свободного места осталось в разделе. Кроме того, если у вас есть несколько жестких дисков, вы можете выполнить простой анализ.
Другие системы
шест. | имя | ls | восм. | описание |
f000 | S_IFMT | 170000 | маска типа файла | |
0000 | 000000 |
в SCO — недействующий inode; в BSD — неизвестный тип; в SVID-v2 и XPG2 — 0 и 0100000 означают обычный файл |
||
1000 | S_IFIFO | p| | 010000 | FIFO (именованный канал) |
2000 | S_IFCHR | c | 020000 | символьный специальный (V7) |
3000 | S_IFMPC | 030000 | мультиплексированный символьный | |
специальный (V7) | ||||
4000 | S_IFDIR | d/ | 040000 | каталог (V7) |
5000 | S_IFNAM | 050000 |
в XENIX — именованный специальный файл с двумя подтипами, различающимися значениями st_rdev — 1, 2 |
|
0001 | S_INSEM | s | 000001 | подтип IFNAM семафора XENIX |
0002 | S_INSHD | m | 000002 | подтип IFNAM общих данных XENIX |
6000 | S_IFBLK | b | 060000 | блочный специальный (V7) |
7000 | S_IFMPB | 070000 | мультиплексированный блочный | |
специальный (V7) | ||||
8000 | S_IFREG | — | 100000 | обычный (V7) |
9000 | S_IFCMP | 110000 | VxFS: сжатый | |
9000 | S_IFNWK | n | 110000 | сетевой специальный (HP-UX) |
a000 | S_IFLNK | 120000 | символьная ссылка (BSD) | |
b000 | S_IFSHAD | 130000 | в Solaris — теневой inode для ACL (не виден пользовательскими процессами) | |
c000 | S_IFSOCK | s= | 140000 | сокет (BSD; также «S_IFSOC» в VxFS) |
d000 | S_IFDOOR | D> | 150000 | Solaris: дверь |
e000 | S_IFWHT | w% | 160000 | BSD whiteout (не используется для inode) |
0200 | S_ISVTX | 001000 |
закрепляющий бит: сохраняет код программы в файле подкачки даже после использования (V7) зарезервировано (SVID-v2) для не каталогов: не кэшировать этот файл (SunOS) для каталогов: флаг ограниченного удаления (SVID-v4.2) |
|
0400 | S_ISGID | 002000 |
set-group-ID при выполнении (V7) для каталогов: использовать семантику BSD для распространения GID |
|
0400 | S_ENFMT | 002000 | жёсткая блокировка файлов в стиле System V (общий c S_ISGID) | |
0800 | S_ISUID | 004000 | set-user-ID на выполнение (V7) | |
0800 | S_CDF | 004000 | каталог является файлом, зависящим от контекста (HP-UX) |
Member constants[edit | edit source]
The following POSIX macros are defined to check the file type using the field:
Name | Notes |
---|---|
is it a regular file? | |
is it a directory? | |
is it a character device? | |
is it a block device? | |
is it a FIFO (named pipe)? | |
is it a symbolic link? (Not in POSIX.1-1996.) | |
is it a socket? (Not in POSIX.1-1996.) |
The following flags are defined for the field:
Name | Value | Notes |
---|---|---|
0170000 | bit mask for the file type bit fields | |
0140000 | socket | |
0120000 | symbolic link | |
0100000 | regular file | |
0060000 | block device | |
0040000 | directory | |
0020000 | character device | |
0010000 | FIFO | |
0004000 | set UID bit | |
0002000 | set-group-ID bit (see below) | |
0001000 | sticky bit (see below) | |
00700 | mask for file owner permissions | |
00400 | owner has read permission | |
00200 | owner has write permission | |
00100 | owner has execute permission | |
00070 | mask for group permissions | |
00040 | group has read permission | |
00020 | group has write permission | |
00010 | group has execute permission | |
00007 | mask for permissions for others (not in group) | |
00004 | others have read permission | |
00002 | others have write permission | |
00001 | others have execute permission |
The set-group-ID bit has several special uses. For a directory it indicates that BSD semantics is to be used for that directory: files created there inherit their group ID from the directory, not from the effective group ID of the creating process, and directories created there will also get the bit set. For a file that does not have the group execution bit set, the set-group-ID bit indicates mandatory file/record locking. The sticky bit on a directory means that a file in that directory can be renamed or deleted only by the owner of the file, by the owner of the directory, and by a privileged process.
POSIX does not describe the , , , , , , , , bits, but instead demands the use of the macros , etc. The and macros are not in POSIX.1-1996, but both are present in POSIX.1-2001; the former is from SVID 4, the latter from SUSv2.
Other Systems — Values that have been (or are) in use on various systems:
hex | name | ls | octal | description |
---|---|---|---|---|
f000 | 170000 | mask for file type | ||
0000 | 000000 | SCO out-of-service inode; BSD unknown type; SVID-v2 and XPG2 have both 0 and 0100000 for ordinary file | ||
1000 | p| | 010000 | FIFO (named pipe) | |
2000 | c | 020000 | character special (V7) | |
3000 | 030000 | multiplexed character special (V7) | ||
4000 | d/ | 040000 | directory (V7) | |
5000 | 050000 | XENIX named special file with two subtypes, distinguished by st_rdev values 1, 2 | ||
0001 | s | 000001 | XENIX semaphore subtype of IFNAM | |
0002 | m | 000002 | XENIX shared data subtype of IFNAM | |
6000 | b | 060000 | block special (V7) | |
7000 | 070000 | multiplexed block special (V7) | ||
8000 | — | 100000 | regular (V7) | |
9000 | 110000 | VxFS compressed | ||
9000 | n | 110000 | network special (HP-UX) | |
a000 | l@ | 120000 | symbolic link (BSD) | |
b000 | 130000 | Solaris shadow inode for ACL (not seen by userspace) | ||
c000 | s= | 140000 | socket (BSD; also «S_IFSOC» on VxFS) | |
d000 | D> | 150000 | Solaris door | |
e000 | w% | 160000 | BSD whiteout (not used for inode) | |
0200 | 001000 | sticky bit: save swapped text even after use (V7) reserved (SVID-v2). On non-directories: don’t cache this file (SunOS). On directories: restricted deletion flag (SVID-v4.2) | ||
0400 | 002000 | set-group-ID on execution (V7) for directories: use BSD semantics for propagation of GID | ||
0400 | 002000 | SysV file locking enforcement (shared with S_ISGID) | ||
0800 | 004000 | set-user-ID on execution (V7) | ||
0800 | 004000 | directory is a context dependent file (HP-UX) |
A sticky command appeared in Version 32V AT&T UNIX.
Инициализация полей структуры
Инициализация полей структуры может осуществляться двумя способами:
- присвоение значений элементам структуры в процессе объявления переменной, относящейся к типу структуры;
- присвоение начальных значений элементам структуры с использованием функций ввода-вывода (например, printf() и scanf()).
В первом способе инициализация осуществляется по следующей форме:
struct ИмяСтруктуры ИмяПеременной={ЗначениеЭлемента1, ЗначениеЭлемента_2, . . . , ЗначениеЭлементаn};
Пример
struct date bd={8,»июня», 1978};
ИмяПеременной.ИмяЭлементаСтруктуры
printf(«%d %s %d»,bd.day, bd.month, bd.year);
Пример
1234567891011121314151617181920212223242526272829303132
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>struct date { int day; char month; int year;};struct persone { char firstname; char lastname; struct date bd;};int main() { system(«chcp 1251»); system(«cls»); struct persone p; printf(«Введите имя : «); scanf(«%s», p.firstname); printf(«Введите фамилию : «); scanf(«%s», p.lastname); printf(«Введите дату рождения\nЧисло: «); scanf(«%d», &p.bd.day); printf(«Месяц: «); scanf(«%s», p.bd.month); printf(«Год: «); scanf(«%d», &p.bd.year); printf(«\nВы ввели : %s %s, дата рождения %d %s %d года», p.firstname, p.lastname, p.bd.day, p.bd.month, p.bd.year); getchar(); getchar(); return 0;}
Имя структурной переменной может быть указано при объявлении структуры. В этом случае оно размещается после закрывающей фигурной скобки }. Область видимости такой структурной переменной будет определяться местом описания структуры.
struct complex_type // имя структуры{ double real; double imag;} number; // имя структурной переменной
Поля приведенной структурной переменной: number.real, number.imag .
Функции запуска и завершения
Функция | Описание |
---|---|
Завершает программу без использования деструкторов или зарегистрированных функций. | |
Завершает программу без использования деструкторов. | |
Регистрирует функцию для завершения программы. | |
Уничтожает объекты с потоком и статическим хранилищем, а затем возвращает управление. | |
Регистрирует функцию без аргументов для завершения программы. | |
Регистрирует функцию с сохраненными объектами для завершения программы. | |
См. Справочник по стандартной библиотеке C. | |
См. Справочник по стандартной библиотеке C. |
_Exit
Remarks
Программа завершается без выполнения деструкторов для объектов автоматической, потоковой или статической длительности хранения и без вызова функций, переданных в . Функция является сигнальной.
abort
Remarks
Программа завершается без выполнения деструкторов для объектов автоматической, потоковой или статической длительности хранения и без вызова функций, переданных в . Функция является сигнальной.
at_quick_exit
Нуль, если регистрация завершается успешно, а не равна нулю в случае сбоя.
Remarks
Функции регистрируют функцию , которая вызывается без аргументов при вызове метода. Вызов этого метода не происходит до тех пор, пока не будут выполнены все вызовы. Функции не представляют состязание за данные. Порядок регистрации может быть неопределенным, если был вызван из более чем одного потока. Поскольку регистрации отличаются от регистраций, приложениям может потребоваться вызывать обе функции регистрации, используя один и тот же аргумент. MSVC поддерживает регистрацию по крайней мере 32 функций.
atexit
Remarks
Функции регистрируют функцию, на которую указывает функция для вызова без аргументов при нормальном завершении программы. Вызов , который не происходит перед вызовом метода, может быть невозможен . Функции не представляют состязание за данные.
Возвращает нуль, если регистрация завершается успешно, ненулевое значение в случае сбоя.
exit
Remarks
Сначала уничтожаются объекты с длительностью хранилища потоков и связанные с текущим потоком.
Затем уничтожаются объекты со статической длительностью хранилища, а функции, регистрируемые вызовом , вызываются. Автоматические объекты не уничтожаются при вызове метода. Если элемент управления оставляет зарегистрированную функцию с именем, поскольку она не предоставляет обработчик для вызываемого исключения, вызывается. Функция вызывается один раз для каждой зарегистрированной. Объекты с автоматическим сроком хранения уничтожаются в программе, функция которой не содержит автоматических объектов и выполняет вызов . Элемент управления можно передать непосредственно в такую функцию, вызывая исключение, которое перехватывается .
Затем все открытые потоки C (как исправленные сигнатуры функций, объявленные в < cstdio > ) с незаписанными буферизованными данными сбрасываются, все открытые c-потоки закрываются, а все файлы, созданные при вызове, удаляются.
Наконец, управление возвращается в среду узла. Если Status имеет значение 0 или EXIT_SUCCESS, возвращается форма, определенная реализацией состояния «успешно завершено». MSVC возвращает нулевое значение. если состояние — EXIT_FAILURE, MSVC возвращает значение 3. в противном случае MSVC возвращает значение параметра status .
quick_exit
Remarks
Как правило, функции, регистрируемые с помощью вызовов , вызываются в порядке их регистрации в обратную. Этот порядок не применяется к функциям, зарегистрированным после того, как уже вызваны другие зарегистрированные функции. При вызове объекты не уничтожаются . Если элемент управления оставляет зарегистрированную функцию с именем, поскольку она не предоставляет обработчик для вызываемого исключения, вызывается. Функция, зарегистрированная с помощью, вызывается потоком, который вызывает метод , который может отличаться от потока, который его зарегистрировал. Это означает, что зарегистрированные функции не должны полагаться на удостоверение объектов с длительностью хранения потока. После вызова зарегистрированных функций вызывает . Стандартные буферы файлов не сбрасываются. Функция является сигнальной, если функции, зарегистрированные в , имеют значение.
пример
Если вас устраивает библиотека std c:
24 Это не стандарт C. Это часть стандарта POSIX, но не стандарта C.
А если вы создаете приложение для Windows, используйте GetFileSizeEx API, поскольку ввод-вывод файла CRT беспорядочный, особенно для определения длины файла, из-за особенностей представления файлов в разных системах;)
Быстрый поиск в Google нашел метод, использующий fseek и ftell, и ветку с этим вопросом с ответами, что это невозможно сделать на одном языке C другим способом.
Вы можете использовать библиотеку переносимости, такую как NSPR (библиотека, на которой работает Firefox), или проверить ее реализацию (довольно сложно).
Я использовал этот набор кода, чтобы определить длину файла.
Попробуй это —
Сначала выполняется поиск до конца файла; затем сообщите, где находится указатель файла. Наконец (это необязательно) он перематывает назад к началу файла
Обратите внимание, что должен быть двоичным потоком
file_size содержит количество байтов, содержащихся в файле
Обратите внимание, что, поскольку (согласно climits.h) тип unsigned long ограничен 4294967295 байтами (4 гигабайта), вам нужно будет найти другой тип переменной, если вы, вероятно, будете иметь дело с файлами большего размера
- 3 Чем это отличается от ответа Дерека 8 лет назад?
- Это неопределенное поведение для двоичного потока и для текстового потока не возвращает значение, представляющее количество байтов, которые могут быть прочитаны из файла.
У меня есть функция, которая хорошо работает только с . Мне он очень нравится, работает очень хорошо и довольно лаконично:
Вот простая и понятная функция, которая возвращает размер файла.
- 1 Не нужно ли закрывать файл?
- Нет, мне не нравятся функции, ожидающие пути. Вместо этого сделайте так, чтобы указатель на файл
Вы можете открыть файл, перейти к 0 смещению относительно нижнего края файла с помощью
значение, возвращаемое из fseek, — это размер файла.
Я давно не кодировал на C, но думаю, что это должно сработать.
12 Вам не нужно определять что-то вроде SEEKBOTTOM. #включают fseek (дескриптор, 0, SEEK_END);
Глядя на вопрос, легко получить количество байтов.
- ожидает в качестве аргумента дескриптор файла, а не имя файла.
- @Barmar, нет не ожидает дескриптора файла, он ожидает вместо. Сначала см. Справочную страницу!
- Подход совершенно неправильный, Постоянно вернется каждый раз!
- Этот ответ совершенно неверен, так как, например, вам нужно использовать сначала искать конец файла, а также ожидает а не строку! Вам будет полезно сформулировать свой ответ.
ЗАМЕЧАНИЯ
statfsfstatfs
В версиях glibc до 2.13, statvfs() заполняла биты поля f_flag сканируя
параметры монтирования в /proc/mounts. Однако начиная с Linux 2.6.36,
нижележащий системный вызов statfs(2) предоставляет необходимую
информацию через поле f_flags, и начиная с glibc версии 2.13, функция
statvfs() будет использовать информацию из этого поля, а не сканируя
/proc/mounts.
Реализации функций в glibc
pathconf(path, _PC_REC_XFER_ALIGN); pathconf(path, _PC_ALLOC_SIZE_MIN); pathconf(path, _PC_REC_MIN_XFER_SIZE);
используют, соответственно, поля f_frsize, f_frsize и f_bsize,
возвращаемые вызовом statvfs() с аргументом path.
Member functions[edit | edit source]
Name | Notes |
---|---|
The stat function returns information about the attributes of the file named by in the structure pointed to by . If is the name of a symbolic link, the attributes you get describe the file that the link points to. If the link points to a nonexistent file name, then stat fails reporting a nonexistent file. The return value is 0 if the operation is successful, or -1 on failure. When the sources are compiled with _FILE_OFFSET_BITS == 64 this function is in fact stat64 since the LFS interface transparently replaces the normal implementation.
Errors: ENOENT means the file named by doesn’t exist. |
|
This function is similar to stat but it is also able to work on files larger than 2^31 bytes on 32-bit systems. To be able to do this the result is stored in a variable of type struct stat64 to which must point. When the sources are compiled with _FILE_OFFSET_BITS == 64 this function is available under the name stat and so transparently replaces the interface for small files on 32-bit machines.
Errors: ENOENT means the file named by doesn’t exist. |
|
The fstat function is like stat, except that it takes an open file descriptor ()as an argument instead of a file name. Like stat, fstat returns 0 on success and -1 on failure. When the sources are compiled with _FILE_OFFSET_BITS == 64 this function is in fact fstat64 since the LFS interface transparently replaces the normal implementation.
Errors: EBADF means the argument is nos a valid file descriptor. |
|
This function is similar to fstat but is able to work on large files on 32-bit platforms. For large files the file descriptor filedes should be obtained by open64 or creat64. The pointer points to a variable of type struct stat64 which is able to represent the larger values. When the sources are compiled with _FILE_OFFSET_BITS == 64 this function is available under the name fstat and so transparently replaces the interface for small files on 32-bit machines.
Errors: EBADF means the argument is nos a valid file descriptor. |
|
The lstat function is like stat, except that it does not follow symbolic links. If is the name of a symbolic link, lstat returns information about the link itself; otherwise lstat works like stat. See Symbolic Links. When the sources are compiled with _FILE_OFFSET_BITS == 64 this function is in fact lstat64 since the LFS interface transparently replaces the normal implementation. | |
The lstat function is like stat, except that it does not follow symbolic links. If is the name of a symbolic link, lstat returns information about the link itself; otherwise lstat works like stat. See Symbolic Links. When the sources are compiled with _FILE_OFFSET_BITS == 64 this function is in fact lstat64 since the LFS interface transparently replaces the normal implementation. |