необходимо сделать сейчас, чтобы был понятен пример 10.7.

Во-первых, вам необходимо объявить operator>> как дружественный для вашего целевого класса, однако в данном случае вам нужно, чтобы он использовал поток istream, а не ostream. Затем определите оператор operator>> (вместо operator<<) для прямого чтения значений из потока в каждую переменную-член вашего класса. Завершив чтение данных, возвратите входной поток.

Смотри также

Рецепт 10.4.

10.6. Получение информации о файле

Проблема

Требуется получить информацию о файле, например о его размере, номере устройства, времени последнего изменения и т.п.

Решение

Используйте вызов системной C-функции stat, определенной в <sys/stat.h>. См. Пример 10.8, где показано типичное применение stat для вывода на печать некоторых атрибутов файла.

Пример 10.8. Получение информации о файле

#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++ обеспечивает операции с содержимым файловых потоков, но она не имеет встроенных средств по чтению и изменению поддерживаемых ОС метаданных файла, например размера файла, его владельца, прав доступа, различных времен и другой информации. Однако стандартный С содержит несколько стандартных библиотек системных вызовов, которые можно использовать для получения различной информации о файле, что сделано в примере 10.8.

Существует два средства, обеспечивающие получение информации о файле. Во-первых, это структура struct с именем stat, которая содержит члены с информацией о файле, и, во-вторых, системный вызов (функция) с тем же самым именем, который обеспечивает получение любой запрошенной информации о файле, помещая ее в структуру stat. Системный вызов — это функция, обеспечивающая некоторую системную службу ОС. Ряд системных вызовов является частью стандартного С, и многие из них стандартизованы и входят в состав различных версий Unix. Структура stat имеет следующий вид (из книги Кернигана (Kernigan) и Ричи (Richie) «The С Programming Language», [издательство «Prentice Hall»]).

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, и вы получите имя файловой системы.

Если вам требуется получить дополнительную информацию о файле, лучше всего обратиться к

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ОБРАНЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату