Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Если целевой каталог не пустой, rmdirзавершится с ошибкой. Для просмотра списка содержимого каталога, перечисления его элементов для их удаления см. рецепт 10.12.

Если вам требуется обеспечить переносимость, не следует самому писать операторы #ifdef, заключая в них специфичные для конкретной ОС функции, — лучше воспользоваться библиотекой Boost Filesystem. В библиотеке Boost Filesystem используется концепция пути для ссылки на файл или каталог, а пути можно удалять с помощью одной функции — remove.

Функция removeRecurseиз примера 10.18 рекурсивно удаляет каталог и все его содержимое. Наиболее важной ее частью является функция remove(которая на самом деле является функцией boost::filesystem::remove, а не стандартной библиотечной функцией). Она принимает путь pathв качестве аргумента и удаляет его, если это файл или пустой каталог, но она не удаляет каталог, если он содержит файлы.

Пример 10.18. Удаление каталога средствами Boost

#include

#include

#include

#include

#include

using namespace std;

using namespace boost::filesystem;

void removeRecurse(const path& p) {

// Сначала удалить содержимое каталога

directory_iterator end;

for (directory_iterator it(p); it != end; ++it) {

if (is_directory(*it)) {

removeRecurse(*it);

} else {

remove(*it);

}

}

// Затем удалить сам каталог

remove(p);

}

int main(int argc, char** argv) {

if (argc != 2) {

cerr << "Usage: " << argv[0] << " [dir name]\n";

return(EXIT_FAILURE);

}

path thePath = system_complete(path(argv[1], native));

if (!exists(thePath)) {

cerr << "Error: the directory " << thePath.string()

<< " does not exist.\n";

return(EXIT_FAILURE);

}

try {

removeRecurse(thePath);

} catch (exception& e) {

cerr << e.what() << endl;

return(EXIT_FAILURE);

}

return(EXIT_SUCCESS);

}

Программный код, обеспечивающий просмотр содержимого каталога, требует некоторых пояснений, и это является темой рецепта 10.12.

Библиотека Boost Filesystem достаточно удобна, однако следует помнить, что формально она не является стандартом, и поэтому нет гарантии, что она будет работать в любой среде. Если вы посмотрите на исходный код библиотеки Boost Filesystem, вы увидите, что фактически она компилирует системные вызовы, специфичные для целевой платформы. Если вас не волнует переносимость, используйте программный интерфейс файловой системы вашей ОС, который, вполне вероятно, обладает большей гибкостью.

Смотри также

Рецепт 10.12.

10.12. Чтение содержимого каталога

Проблема

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

Решение

Для получения переносимого решения воспользуйтесь классами и функциями библиотеки Boost Filesystem. Она содержит ряд удобных функций по работе с файлами, обеспечивая переносимое представление путей, итераторы каталога и различные функции по переименованию, удалению и копированию файлов и т.п. Пример 10.19 показывает, как можно использовать некоторые из этих средств.

Пример 10.19. Чтение каталога

#include

#include

#include

using namespace boost::filesystem;

int main(int argc, char** argv) {

if (argc < 2) {

std::cerr << "Usage: " << argv[0] << " [dir name]\n";

return(EXIT_FAILURE);

}

path fullPath = // Создать полный, абсолютный путь

system_complete(path(argv[1], native));

if (!exists(fullPath)) {

std::cerr << "Error: the directory " << fullPath.string()

<< " does not exist.\n";

return(EXIT_FAILURE);

}

if (!is_directory(fullPath)) {

std::cout << fullPath.string() << " is not a directory!\n";

return(EXIT_SUCCESS);

}

directory_iterator end;

for (directory_iterator it(fullPath);

it != end; ++it) { // Просматривать в цикле каждый

// элемент каталога почти

std::cout << it->leaf(); // так же, как это делалось бы для

if (is_directory(*it)) // STL-контейнера

std::cout << " (dir)";

std::cout << '\n';

}

return(EXIT_SUCCESS);

}

Обсуждение

Как и при создании и удалении каталогов (см. рецепты 10.10 и 10.11), не существует стандартного, переносимого способа чтения содержимого каталога. Чтобы облегчить жизнь в C++, библиотека Filesystem проекта Boost содержит ряд переносимых функций по работе с файлами и каталогами. Она также содержит много других функций; дополнительную информацию вы найдете при описании других рецептов этой главы или на веб-странице библиотеки Boost Filesystem сайта www.boost.com .

В примере 10.19 приводится простая программа просмотра каталога (наподобие команды lsв Unix или dirв MS-DOS). Сначала она следующим образом формирует абсолютный путь на основе аргументов, переданных программе.

path fullPath = complete(path(argv[1], native));

Тип данных переменной, содержащей путь, называется, естественно, path(путь). С этим типом данных работает файловая система, и он легко преобразуется в строку путем вызова path::string. После формирования пути программа проверяет его существование (с помощью функции exists), затем с помощью другой функции, is_directory, проверяет, задает ли данный путь каталог. Если ответ положителен, то все хорошо и можно перейти к реальной работе по просмотру содержимого каталога.

Файловая система имеет класс с именем directory_iterator, который использует стандартную семантику итераторов, подобную применяемой для стандартных контейнеров, чтобы можно было использовать итераторы как указатели на элементы каталога. Однако в отличие от стандартных контейнеров здесь нет функции-члена end, представляющей элемент, следующий за последним элементом (т.е. vector::end). Вместо этого, если вы создаете итератор каталога directory_iteratorпри помощи стандартного конструктора, он предоставляет конечный маркер, который вы можете использовать в операциях сравнения для определения момента завершения просмотра каталога. Поэтому используйте следующий оператор.

directory_iterator end;

Затем вы можете создать итератор для вашего пути и следующим образом сравнивать его с маркером конца.

for (directory_iterator it(fullPath); it != end; ++it) {

// выполнить любые действия с *it

std::cout << it->leaf();

}

Функция-член leafвозвращает строку, представляющую конечный элемент пути, а не весь путь, который вы можете получить, вызывая функцию-член string.

Если вам требуется обеспечить переносимость, но по каким-то причинам вы не можете использовать библиотеки Boost, обратите внимание на исходный код Boost. Он содержит операторы #ifdef, которые учитывают (по большей части) отличия среды Windows и ОС, использующих интерфейс Posix, и в частности отличия в представлении путей, например буквы дисководов и имена устройств.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x