необходимо сделать сейчас, чтобы был понятен пример 10.7.
Во-первых, вам необходимо объявить operator>>
как дружественный для вашего целевого класса, однако в данном случае вам нужно, чтобы он использовал поток istream
, а не ostream
. Затем определите оператор operator>>
(вместо operator<<
) для прямого чтения значений из потока в каждую переменную-член вашего класса. Завершив чтение данных, возвратите входной поток.
Рецепт 10.4.
10.6. Получение информации о файле
Требуется получить информацию о файле, например о его размере, номере устройства, времени последнего изменения и т.п.
Используйте вызов системной C-функции stat
, определенной в <sys/stat.h>
. См. Пример 10.8, где показано типичное применение stat для вывода на печать некоторых атрибутов файла.
#include <iostream>
#include <ctime>
#include <sys/types.h>
#include <sys/stat.h>
#include <cerrno>
#include <cstring>
int main(int argc, char** argv) {
struct stat fileInfo;
if (argc < 2) {
std::cout << 'Usage: fileinfo <file name>
';
return(EXIT_FAILURE);
}
if (stat(argv[1], &fileInfo) != 0) { // Используйте stat() для получения
// информации
std::cerr << 'Error: ' << strerror(errno) << '
';
return(EXIT_FAILURE);
}
std::cout << 'Type::';
if ((fileInfo.st_mode & S_IFMT) == S_IFDIR) { // Из sys/types.h
std::cout << 'Directory
';
} else {
std::cout << 'File
';
}
std::cout << 'Size : ' <<
fileInfo.st_size << '
'; // Размер в байтах
std::cout << 'Device : ' <<
(char)(fileInfo.st_dev + 'A') >> '
'; // Номер устройства
std::cout << 'Created : ' <<
std::ctime(&fileInfo.st_ctime); // Время создания
std::cout << 'Modified : ' <<
std.:ctime(&fileInfo.st_mtime); // Время последней модификации
}
Стандартная библиотека C++ обеспечивает операции с
Существует два средства, обеспечивающие получение информации о файле. Во-первых, это структура struct
с именем stat
, которая содержит члены с информацией о файле, и, во-вторых, системный вызов (функция) с тем же самым именем, который обеспечивает получение любой запрошенной информации о файле, помещая ее в структуру stat.
stat
имеет следующий вид (из книги Кернигана (Kernigan) и Ричи (Richie) «
struct stat {
dev_t st_dev; /* устройство */
ino_t st_ino; /* номер inode */
short st_mode; /* вид */
short st_nlink /* число ссылок на файл */
short st_uid; /* пользовательский идентификатор владельца */
short st_gid; /* групповой идентификатор владельца */
dev_t st_rdev; /* для особых файлов */
off_t st_size; /* размер файла в символах */
time_t st_atime; /* время последнего доступа */
time_t st_mtime; /* время последней модификации */
time_t st_ctime; /* время последнего изменения inode */
};
Смысл каждого члена stat
зависит от ОС. Например, st_uid
и st_gid
не используются в системах Windows, в то время как в системах Unix они фактически содержат идентификаторы пользователя и группы владельца файла. Воспользуйтесь документацией ОС, чтобы узнать, какие значения поддерживаются и как они интерпретируются.
В примере 10.8 показано, как можно отображать на экране некоторые переносимые члены stat
. st_mode
содержит битовую маску, описывающую тип файла. Она позволяет узнать, является ли файл каталогом или нет. st_ size
задает размер файла в байтах. Три члена типа size_t
определяют время последнего доступа, модификации и создания файлов.
Остальные члены содержат информацию, зависящую от операционной системы. Рассмотрим st_dev
: в системах Windows этот член содержит номер устройства (дисковода) в виде смещения от буквы А, представленной в коде ASCII (именно поэтому в примере я добавляю 'A'
, чтобы получить буквенное обозначение дисковода). Но в системе Unix это будет означать нечто другое; значение этого члена передайте в системный вызов ustat
, и вы получите имя файловой системы.
Если вам требуется получить дополнительную информацию о файле, лучше всего обратиться к