web-dev-qa-db-fra.com

C++ lu depuis istream jusqu'à la nouvelle ligne (mais pas les espaces)

J'ai un std :: istream qui fait référence aux données de la matrice, quelque chose comme:

0.0 1.0 2.0
3.0 4.0 5.0

Maintenant, afin d’évaluer le nombre de colonnes, j'aimerais avoir du code comme:

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

où le ... quelque chose ... la partie est évaluée à false après avoir lu 2.0 et istream au point devrait être à 3.0 pour que le prochain

istream >> x;

devrait définir x égal à 3.0.

Comment obtiendriez-vous ce résultat? Je suppose que la condition tout en

Merci beaucoup d'avance pour votre aide!

18
StephQ

Utilisez la méthode peek pour vérifier le caractère suivant:

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

Lisez les lignes dans un std :: string en utilisant std :: getline () , puis assignez la chaîne à un objet std :: istringstream , et extrayez les données à partir de cela plutôt que directement à partir de 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;

Vous pouvez utiliser std::istream::peek() pour vérifier si le caractère suivant est une nouvelle ligne. Voir cette entrée dans la référence cplusplus.com.

1
MKroehnert

Lisez le numéro, puis lisez un caractère pour voir s’il s’agit d’un saut de ligne.

0
Messa

J'ai eu le même problème
La saisie est la suivante:

1 2
3 4 5

Les deux premiers étaient N1 et N2
Ensuite, il y a une nouvelle ligne
Alors les éléments 3 4 5, je ne sais pas combien ils seront.

// 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
}

Cela a fonctionné parfaitement pour moi.

0