Читаем C++. Сборник рецептов полностью

Класс path из библиотеки Boost Filesystem позволяет легко получить с помощью функции-члена path::leaf последний элемент полного пути, которым может быть имя файла или каталога. В примере 10.22 приводится простая программа, которая использует эту функцию, чтобы показать, к чему относится этот путь: к файлу или к каталогу.

Пример 10.22. Получение имени файла из пути

#include

#include

#include

using namespace std;

using namespace boost::filesystem;

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

 // Проверка параметров

 try {

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

 cout << p.leaf() << " is a "

  << (is_directory(p) ? "directory" : "file") << endl;

 } catch (exception& e) {

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

 }

 return(EXIT_SUCCESS);

}

См. обсуждение рецепта 10.7, где более детально рассматривается класс path.

Смотри также

Рецепт 10.15.

<p>10.15. Извлечение пути из полного имени файла</p>Проблема

Имеется полное имя файла (имя файла и путь доступа к нему), например d:\apps\src\foo.с, и требуется получить путь к файлу, d:\apps\src.

Решение

Примените подход, который использовался в предыдущих двух рецептах, и используйте функции rfind и substr для поиска и получения из полного пути то, что вам нужно. В примере 10.23 приводится короткая программа, показывающая, как это можно сделать.

Пример 10.23. Получение пути из полного имени файла

#include

#include

using std::string;

string getPathName(const string& s) {

 char sep = '/';

#ifdef _WIN32

 sep = '\\';

#endif

 size_t i = s.rfind(sep, s.length());

 if (i != string::npos) {

  return(s.substr(0, !));

 }

 return("");

}

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

 string path = argv[1];

 std::cout << "The path name is \"" << getPathName(path) << "\"\n";

}

Обсуждение

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

Пример 10.24. Получение базового пути

#include

#include

#include

using namespace std;

using namespace boost::filesystem;

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

 // Проверка параметров...

 try {

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

  cout << p.branch_path().string() << endl;

 } catch (exception& e) {

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

 }

 return(EXIT_SUCCESS);

}

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

D:\src\ccb\c10>bin\GetPathBoost.exe с:\windows\system32\1033

с:/windows/system32

Смотри также

Рецепты 10.13 и 10.14.

<p>10.16. Замена расширения файла</p>Проблема

Имеется имя файла (возможно, с путем доступа к нему) и требуется заменить расширение файла. Например, имя файла thesis.tex требуется преобразовать в thesis.txt.

Решение

Используйте функции-члены rfind и replace класса string для поиска расширения и его замены. Пример 10.25 показывает, как это можно сделать.

Пример 10.25. Замена расширения файла

#include

#include

using std::string;

void replaceExt(string& s, const string& newExt) {

 string::size_type i = s.rfind('.', s.length());

 if (i != string::npos) {

  s.replace(i+1, newExt.length(), newExt);

 }

}

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

 string path = argv[1];

 replaceExt(path, "foobar");

 std::cout << "The new name is \"" << path << "\"\n";

}

Обсуждение
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных