あなたが探していることを達成するためのいくつかの方法があります、この投稿では3つの異なる方法を説明します。std::ifstream ifs ("filename.txt")
これらの3つはすべて、を使用してファイルを開き、「配列」は実際にはとして宣言されたベクトルであると想定していますstd::vector<int> v
。
この投稿の最後に、ベクターへの挿入を高速化する方法についてのアドバイスもあります。
シンプルにしたいと思います。
最も簡単なアプローチは、char
を使用して一度に1つずつ読み取り、返された値からoperator>>
減算することです。'0'
標準では、'0'
through'9'
がシーケンシャルであり、achar
は別の問題で出力される数値にすぎないため、暗黙的ににキャストできることが保証されていint
ます。
char c;
while (ifs >> c)
v.push_back (c - '0');
私はSTLが大好きで、ループを書くのは嫌いです。
これは、特にSTLファンと話している場合は、「 c ++で実行する方法」として扱われますが、作成するにはさらに多くのコードが必要になります。
#include <algorithm>
#include <functional>
#include <iterator>
...
std::transform (
std::istream_iterator<char> (ifs),
std::istream_iterator<char> (),
std::back_inserter (v),
std::bind2nd (std::minus<int> (), '0')
);
ループを書きたくないのですが、ラムダを使用してみませんか?c ++ 11
#include <algorithm>
#include <functional>
#include <iterator>
...
std::transform (
std::istream_iterator<char> (iss),
std::istream_iterator<char> (),
std::back_inserter (v),
[](char c){return c - '0';}
);
std::vector
挿入するたびにストレージを再割り当てしますか?
はい、たぶん。処理を高速化するために、以下のように、挿入を開始する前にベクターのストレージを予約できます。
ifs.seekg (0, std::ios::end); // seek to the end of your file
v.reserve (ifs.tellg () ); // ifs.tellg () -> number of bytes in it
ifs.seekg (0, std::ios::beg); // seek back to the beginning