C ++ читает от istream до новой строки (но не пробела) - PullRequest
18 голосов
/ 16 июля 2010

У меня есть 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.

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

Большое спасибо заранее за помощь!

Ответы [ 6 ]

12 голосов
/ 16 июля 2010

Используйте метод peek для проверки следующего символа:

while ((istream.peek()!='\n') && (istream>>x))
7 голосов
/ 16 июля 2010

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

2 голосов
/ 16 июля 2010
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;
1 голос
/ 16 июля 2010

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

0 голосов
/ 13 августа 2016

У меня была похожая проблема
Ввод, как показано ниже:

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
}

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

0 голосов
/ 16 июля 2010

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

...