Подтвердить что ты не робот

С++ читается из 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

где... что-то... часть оценивает значение false после того, как я прочитал 2.0, и istream в точке должен быть в 3.0, чтобы следующий

istream >> x;

должен установить x равным 3.0.

Как бы вы достигли этого результата? Я предполагаю, что условие while

Заранее спасибо за вашу помощь!

4b9b3361

Ответ 1

Используйте метод peek, чтобы проверить следующий символ:

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

Ответ 2

Прочитайте строки в std::string, используя std:: getline(), затем назначьте строку std:: istringstream и извлекать данные из этого, а не напрямую из istream.

Ответ 3

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;

Ответ 4

Вы можете использовать std::istream::peek(), чтобы проверить, является ли следующий символ символом новой строки. См. эту запись в справочнике cplusplus.com.

Ответ 5

Прочитайте номер, затем прочитайте один символ, чтобы увидеть, была ли новая строка.

Ответ 6

У меня была аналогичная проблема
Вход:

1 2
3 4 5

Первые два были N1 и N2
Тогда есть новая строка
то элементы 3 4 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
}

Это сработало идеально для меня.