The Modern C++ Challenge 第3章 の続きです。
今回は第4章に挑戦します。
まずは目次を読む。
第4章 ストリームとファイルシステム
- パスカルの三角形
- プロセスリストの表形式の印刷
- テキストファイルから空行を削除する
- ディレクトリのサイズの計算
- 特定の日付より古いファイルの削除
- 正規表現に一致するディレクトリ内のファイルを検索する
- 一時ログファイル
問題文も読む。
問32. パスカルの三角形
コンソールに最大 10 行のパスカルの三角形を出力する関数を作成します。
ソースコードを斜め読みして実行する。
すんなり実行できなかった。
第34問から第38問にて std::filesystem を使っている。
Ubuntu では下記のエラーになる。
fatal error: filesystem: そのようなファイルやディレクトリはありません
Ubuntu の g++ のバージョンは7.5.0 であり、
filesystem に対応していない。
g++-8 をインストールする。
さらにコンパイルオプションに
-lstdc++fs を追加する。
g++-8 main.cpp -std=c++17 -lstdc++fs
c++17 filesystem
is not a namespace-name
なお、Macの場合は -std=c++17 を追加するだけでよい。
CMakeLists.txt を修正する。
g++ main.cpp -std=c++17
第38問は、もうひと手間かかった。
stduuid というライブラリを使っている。 libs から uuid.h をコピーする。
コンパイラーの警告に従い、下記を追加する。
include < cstring >
Ubuntu はこれで実行できた。
Mac では、uuid.h のエラーがなくならない。
uuid.h を何に使っているのかソースを読んでみる。
uuid を生成して一時ファイルの名前に使っている。
この用途なら、uuid.h を使わなくとも、
<uuid/uuid.h> で十分だと思い、
main.cpp を変更した。
これでMac でも実行できた。
C言語での書き直しもやってみた。
第38問 はディレクトリ内を再帰的に走査するという設問になっている。
C++ では recursive_directory_iterator という便利な関数が用意されている。
C言語に書き直すのは、かなり面倒だった。
cpprefjp: std::filesystem::recursive_directory_iterator
第4章 のソースコードを Github に公開した。
https://github.com/ohwada/The-Modern-Cpp-Challenge/tree/main/The-Modern-Cpp-Challenge/Chapter04