次のような行列データを参照するstd :: istreamがあります。
0.0 1.0 2.0
3.0 4.0 5.0
ここで、列の数を評価するために、次のようなコードが必要です。
std::vector<double> vec;
double x;
while( (...something...) && (istream >> x) )
{
vec.Push_back(x);
}
//Here vec should contain 0.0, 1.0 and 2.0
ここで、...何か...の部分は2.0を読んだ後、falseと評価され、その時点でのistreamは3.0になるはずなので、次の
istream >> x;
xを3.0に設定する必要があります。
この結果をどのように達成しますか? while条件だと思います
よろしくお願いします!
peek
メソッドを使用して、次の文字を確認します。
while ((istream.peek()!='\n') && (istream>>x))
std :: getline() を使用して行をstd :: stringに読み込み、文字列を std :: istringstream オブジェクトに割り当て、そこからデータを抽出します。 istreamから直接よりも。
std::vector<double> vec;
{
std::string line;
std::getline( ifile, line );
std::istringstream is(line);
std::copy( std::istream_iterator<double>(is), std::istream_iterator<double>(),
std::back_inserter(vec) );
}
std::cout << "Input has " << vec.size() << " columns." << std::endl;
std::cout << "Read values are: ";
std::copy( vec.begin(), vec.end(),
std::ostream_iterator<double>( std::cout, " " ) );
std::cout << std::endl;
std::istream::peek()
を使用して、次の文字が改行であるかどうかを確認できます。 cplusplus.comリファレンスの このエントリ を参照してください。
数字を読んでから、1文字を読んで改行かどうかを確認します。
私も同様の問題を抱えていました
入力は次のとおりです。
1 2
3 4 5
最初の2つはN1とN2でした
次に改行があります
次に要素34 5、これらがいくつになるかわかりません。
// read N1 & N2 using cin
int N1, N2;
cin >> N1;
cin >> N2;
// skip the new line which is after N2 (i.e; 2 value in 1st line)
cin.ignore(numeric_limits<streamsize>::max(), '\n');
// now read 3 4 5 elements
int ele;
// 2nd EOF condition may required,
// depending on if you dont have last new-line, and it is end of file.
while ((cin_.peek() != '\n') && (cin_.peek() != EOF)) {
cin >> ele;
// do something with ele
}
これは私にとって完璧に機能しました。