web-dev-qa-db-ja.com

C ++はistreamから改行まで読み取られます(空白ではありません)

次のような行列データを参照する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条件だと思います

よろしくお願いします!

18
StephQ

peek メソッドを使用して、次の文字を確認します。

while ((istream.peek()!='\n') && (istream>>x))
12
tzaman

std :: getline() を使用して行をstd :: stringに読み込み、文字列を std :: istringstream オブジェクトに割り当て、そこからデータを抽出します。 istreamから直接よりも。

7
Clifford
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
MKroehnert

数字を読んでから、1文字を読んで改行かどうかを確認します。

0
Messa

私も同様の問題を抱えていました
入力は次のとおりです。

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
}

これは私にとって完璧に機能しました。