タイトルでは「テキストファイルを読む」とありますが、ファイルに限定する必要はないので、まずは反復子を使って汎用的に実装したあと、ファイルを扱うための関数を多重定義していくことにします。

ところで、最近は改行文字にCRを使うケースに遭遇することはあまりなくなったものの、あえて除外する理由もないので対応していくことにしましょう。

まずは反復子を使った実装からです。

ちょっと長くなりましたが、元ネタも同じぐらいの長さなのでまあ良しとしましょう。この実装ではstring_viewを使っているのでC++17以降でのコンパイルが必要です。この連載はコードのサンプル的な意味合いもあるので、やや新しい言語仕様も使っていきたいと思います。

今度は、この関数に1枚被せることで、ストリームに対応させてみましょう。

1文字ずつ読み込む必要があるので、istream_iteratorではなくistreambuf_iteratorを使っています。istream_iteratorを使うと空白類文字が読み飛ばされてしまいますので。

最後に、元ネタに近い形で入力するファイルのファイル名を渡す形の関数も実装してみることにしましょう。

こんな感じで何段階かの関数を用意しておけば汎用性が増しそうです。


元ネタ

↑ 8. 入出力に関するテンプレート