2017-01-30 4 views
1

J'ai quelques problèmes, que je pense sont étroitement liés, mais je ne pouvais pas les obtenir après ce que j'ai trouvé sur le site.Deuxième cin est soit sauté ou ne fonctionne pas correctement

Mes problèmes sont liés à la double utilisation de cin dans ma fonction principale. J'ai besoin de lire les chiffres du clavier pour construire de petits vecteurs ou stocker des coefficients simples. Je ne peux pas savoir à l'avance la longueur des vecteurs que je vais construire.

Voici les lignes concernées:

#include <vector> 
#include <iostream> 
#include <limits> 

int main() { 
    ... 
    double a=0; 
    std::vector<double> coefficients; 
    while (std::cin>>a) { 
     coefficients.push_back(a); 
    } 
    ... 
    std::vector<double> interval; 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max()); 
    while(std::cin>>a) { 
     interval.push_back(a); 
    } 
    std::cout<<interval.size()<<std::endl; 
    std::cout<<*interval.cbegin()<<" "<<*(interval.cend()-1)<<std::endl; 
    ... 
} 

J'utilise à la fois macOS avec g ++ 6.3.0 et Linux avec g ++ 5.3.0. Les drapeaux que j'envoie au compilateur sont -Wall -std=c++14 -o.
Sur la machine macOS, la seconde cin est complètement ignorée, tandis que sur la machine Linux, le second processus de lecture ne se comporte pas comme prévu. Je veux dire que si je donne -1 1 au second cin, la taille du vecteur imprimé est 0 et, évidemment, le programme s'arrête à cause d'un défaut de segmentation.

À chaque cin, entrez les numéros demandés sur une seule ligne, comme 1 0 0 1, puis appuyez sur Entrée, puis sur ctrl + D.

Merci d'avance à tous! :)

+0

Avez-vous envisagé d'utiliser 'getline' à la place? – molbdnilo

+0

Ouais je l'ai fait et que, en plus de se débarrasser de la ligne 'cin.ignore', laisse mon code s'exécuter comme prévu sur la machine Linux. Cependant, ce n'est pas le cas pour le macOS. Alors, je devrais abandonner 'cin' une fois pour toutes? – Sandro

Répondre

0

Votre appel de std::cin.ignore(...) régler le bit échec du flux. Cela rend impossible d'entrer dans la boucle. Vous devez déplacer l'appel std::cin.clear() juste avant la boucle, afin de le faire fonctionner. En outre, vous avez une lecture hors-limite lorsqu'il n'y a pas de données dans le second conteneur.

#include <vector> 
#include <iostream> 
#include <limits> 
#include <string> 

int main() { 
    double a=0; 
    std::vector<double> coefficients; 
    while (std::cin>>a) { 
     coefficients.push_back(a); 
    } 
    std::cout << coefficients.size() << '\n'; 

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'X'); 
    std::cin.clear(); 
    char c; 
    std::cin>>c; 
    if(c != 'X') 
    { 
     std::cerr << "Invalid separator\n"; 
     return 1; 
    } 

    std::vector<double> interval; 
    while(std::cin >> a) { 
     interval.push_back(a); 
    } 
    std::cout<< interval.size()<<std::endl; 
    if(interval.size()) 
     std::cout<<*interval.cbegin()<<" "<<*(interval.cend()-1)<<std::endl; 

    return 0; 
} 

Avec le fichier de données suivantes,

$ cat data.txt 
12 23 
42 
X 
1 2 
3 4 5 

cette sortie est générée:

$ ./a.out < data     
3 
5 
1 5 
+0

Merci! Je ne savais pas que 'std :: cin.ignore()' définit le bit d'échec du flux. Maintenant, le programme fonctionne bien sur Linux. Toujours inchangé sur macOS, mais c'est secondaire maintenant. – Sandro

0

Vous devez ajouter un saut de ligne '\n' comme second paramètre à cin.ignore() il tue l'ignorer sur une presse entrer

+0

Oui, j'ai aussi essayé, mais rien ne change. Sur macOS, le second cin est simplement sauté et sous Linux cela ne fonctionne toujours pas comme je l'ai expliqué plus haut. – Sandro