実装例
# include <fstream>
# include <iostream>
# include <vector>
void main(){
std::ifstream inputFile("ファイルパス");
std::vector<char> data{std::istreambuf_iterator<char>(inputFile), std::istreambuf_iterator<char>()};
std::cout << data[0] << std::endl;
}
解説
ifstream
はファイル読み込みに使用するクラスです。
fstream
がファイル入出力で、読み込み専用なのでinputのiがついてifstream
となります。
出力用だとoutputのoがついてofstream
です。
vectorの波カッコは一様初期化というコンストラクタの呼び出し方です。
vectorコンストラクタに
vector(InputIter first, InputIter last, const Allocator& a = Allocator());
というものがあります。
第一引数のイテレータから第二引数のイテレータまでの範囲をvectorのメモリに格納してくれるというものです。
ifstream
のイテレータを作成するためistreambuf_iterator
を使用します。
istreambuf_iterator
は引数を指定しなければendイテレータと等しくなるため、第二引数に使用できます。
注意点
vectorのコンストラクタを丸カッコで呼び出すこともできます。
std::vector<char> data((std::istreambuf_iterator<char>(inputFile)), (std::istreambuf_iterator<char>()));
この時、vectorコンストラクタの第一引数、第二引数共にカッコでくくられていることに注意してください。
例えばカッコを削除してしまい、
std::vector<char> data((std::istreambuf_iterator<char>(inputFile)), (std::istreambuf_iterator<char>()));
とするところを
std::vector<char> data(std::istreambuf_iterator<char>(inputFile), std::istreambuf_iterator<char>());
としてしまうと思った通りの挙動にならないので注意してください。
data[0]
などとアクセスするタイミングでビルドエラーになります。
理由は、カッコを無くした場合関数宣言になってしまうからです。
std::vector<char>
が戻り値でstd::istreambuf_iterator<char>(inputFile)
とstd::istreambuf_iterator<char>()
が引数のdata
という関数が宣言されてしまいます。
そのため、data[0]などと記述すると怒られます。