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!
Utilisez la méthode peek
pour vérifier le caractère suivant:
while ((istream.peek()!='\n') && (istream>>x))
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.
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.
Lisez le numéro, puis lisez un caractère pour voir s’il s’agit d’un saut de ligne.
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.