The Modern C++ Challenge 第4章

The Modern C++ Challenge 第3章 の続きです。

今回は第4章に挑戦します。

まずは目次を読む。

第4章 ストリームとファイルシステム

  1. パスカルの三角形
  2. プロセスリストの表形式の印刷
  3. テキストファイルから空行を削除する
  4. ディレクトリのサイズの計算
  5. 特定の日付より古いファイルの削除
  6. 正規表現に一致するディレクトリ内のファイルを検索する
  7. 一時ログファイル

問題文も読む。

問32. パスカルの三角形
コンソールに最大 10 行のパスカルの三角形を出力する関数を作成します。

wikipedia: パスカルの三角形

ソースコードを斜め読みして実行する。
すんなり実行できなかった。

第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

filesystemが見つからないというコンパイルエラー

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