2

次のようなテキストファイルがあります。

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511

など。合計20行。私がやりたいのは、テキストファイルからすべての桁を読み取り、それらを整数の配列(1要素= 1桁)に入れることです。行全体ではなく、このテキストファイルから1桁だけを読み取るにはどうすればよいですか?

4

2 に答える 2

10

あなたが探していることを達成するためのいくつかの方法があります、この投稿では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')
);

ループを書きたくないのですが、ラムダを使用してみませんか?

#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
于 2012-06-20T12:45:11.740 に答える
4
char digit;
std::ifstream file("digits.txt");
std::vector<int> digits;
// if you want the ASCII value of the digit.
1- while(file >> digit) digits.push_back(digit);
// if you want the numeric value of the digit.
2- while(file >> digit) digits.push_back(digit - '0'); 
于 2012-06-20T12:23:05.663 に答える