RAD Studio XE8のGetItでライブラリをインストールしてみる

RAD Studio XE8のGetItでBoostをインストールしてみました。

メニューの「ツール」→「GetIt…」を選択します。

01

GetItのウィンドウが表示されます。

02

「Boost 1.39 1.55」の「インストール」ボタンを押します。

03

ライセンスの画面が表示されます。

04

「すべて同意する」をクリックすると、インストーラのダウンロードが始まります。

05

ダウンロードが完了すると、インストーラが起動します。

06

見覚えのある画面が表示されます。

07

インストールするファイルのダウンロードが始まります。
かなり時間がかかりました。

08

09

10

11

コンポーネントのパスなどが追加されるため、RAD Studioの再起動が必要です。

12

13

再びGitItを開くと、インストール済みのライブラリはボタンが「インストール」から「アンインストール」に変わっていました。

14

C++のboost::filesystemでファイルやディレクトリを操作する

C++のboost::filesystemでファイルやディレクトリを操作する方法。

ファイルのコピー

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>

try {
  boost::filesystem::path src("C:\\sample\\src.txt");
  boost::filesystem::path dst("C:\\sample\\dst.txt");
  boost::filesystem::copy_file(src, dst);
} catch (std::exception& e) {
  std::cout << e.what() << std::endl;
}

ファイルの削除

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>

boost::filesystem::path src("C:\\sample\\src.txt");
if (boost::filesystem::remove(src)) {
  std::cout << "ok" << std::endl; //削除した
}

ファイル名の変更

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>

boost::filesystem::path src("C:\\sample\\src.txt");
boost::filesystem::path dst("C:\\sample\\dst.txt");
try{
  boost::filesystem::rename(src, dst);
} catch (std::exception& e) {
  std::cout << e.what() << std::endl;
}

ディレクトリの作成

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>

boost::filesystem::path dir("C:\\sample\\test");
if (boost::filesystem::create_directory(dir)) {
  std::cout << "ok" << std::endl; //ディレクトリの作成に成功した
}

ディレクトリの削除(ファイルの削除と同じ)

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>

boost::filesystem::path dir("C:\\sample\\test");
if (boost::filesystem::remove(dir)) {
  std::cout << "ok" << std::endl; //削除した
}

※ディレクトリが空でない時は削除に失敗する。次の「ディレクトリの内容の取得」でディレクトリを空にしてから削除すること。

ディレクトリの内容の取得

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>

boost::filesystem::path dir("C:\\sample");
boost::filesystem::directory_iterator end;
for (boost::filesystem::directory_iterator p(dir); p != end; ++p) {
  std::cout << p->leaf() << std::endl; //ファイル名
  std::cout << p->string() << std::endl; //フルパス
  if (boost::filesystem::is_directory(*p)) {  //ディレクトリの時
    std::cout << "<DIR>" << std::endl;
  }
}

フルパスからファイル名とパス名を取得する

#include <boost/filesystem/path.hpp>

boost::filesystem::path f("C:\\sample\\src.txt");
std::cout << f.leaf() << std::endl; //=> src.txt
std::cout << f.branch_path() << std::endl; //=> C:\sample

boost::splitで文字列を分割する

よくある文字列の分割処理は、boost::splitを使うと簡単です。

boost::splitの引数

boost::splitは3つの引数をとります。

  1. 出力シーケンス
  2. 入力コレクション
  3. 区切り文字を判断する述語

boost::splitで文字列をカンマで分割する

#include <iostream>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/foreach.hpp>

std::string s = "abc,def,ghi,jkl"; //分割する文字列
std::list<std::string> results; //分割結果を格納する変数
boost::split(results, s, boost::is_any_of(",")); //,区切り

//分割結果を出力
BOOST_FOREACH(std::string p, results) {
  std::cout << p << std::endl;
}

複数の区切り文字で分割する例

#include <iostream>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/foreach.hpp>

std::string s = "2011/02/09 20:19:33";
std::list<std::string> results;
//スラッシュ、スペース、コロンで分割
boost::split(results, s, boost::is_any_of("/ :"));

BOOST_FOREACH(std::string p, results) {
  std::cout << p << std::endl;
}

空白文字で分割

#include <iostream>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/foreach.hpp>

std::string s = "More Effective C++";
std::list<std::string> results;
//空白文字で分割
boost::split(results, s, boost::is_space());

BOOST_FOREACH(std::string p, results) {
  std::cout << p << std::endl;
}

boost::assignでコンテナに要素を追加するコードを簡潔に記述する

boost::assignを使うと、コンテナに要素を追加するコードを簡潔に記述することができます。

必要なヘッダ

#include <boost/assign.hpp>

一般的にstd::vectorに要素を追加するには、push_backを繰り返し使います。

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);

boost::assignを使うと、次にように簡潔に書くことができます。

using namespace boost::assign;
std::vector<int> v;
v += 1,2,3,4,5;

同様に、std::mapへの要素の追加は次のように書くことができます。

using namespace boost::assign;
std::map<std::string, int> m;
insert(m)("one", 1)("two", 2)("tree", 3);

std::vectorに初期化で要素を追加する場合は、boost::assign::list_ofを使います。

std::vector<int> v = boost::assign::list_of(1)(2)(3)(4)(5);

set::setも同じです。

std::set<int> s = boost::assign::list_of(1)(2)(3)(4)(5);

std::mapに初期化で要素を追加する場合は、boost::assign::map_list_ofを使います。

std::map<std::string, int> m = boost::assign::map_list_of("one", 1)("two", 2)("tree", 3);

boost::tupleの場合は、boost::assign::tuple_list_ofを使います。

std::vector<boost::tuple<int, std::string, int> > t = boost::assign::tuple_list_of(1, "foo", 2)(3, "bar", 4);