2017-10-06 4 views
0

Cette entrée est redirigée à partir du fichier vers le fichier exécutable dans un terminal unix:Cin ne suspend pas pour l'entrée, malgré l'utilisation de deux cin.clear() et cin.ignore()

10 1 2 3 4 5 6 7 8 9 10 
5 10 20 30 40 50 

Cin ne attendre l'entrée même si elle semble être en bon état pour le faire.

int main(void) { 
    std::cout << "GOOD: " << std::cin.good() << std::endl 
       << "EOF: " << std::cin.eof() << std::endl 
       << "FAIL: " << std::cin.fail() << std::endl 
       << "BAD: " << std::cin.bad() << "\n\n"; 
    int s; 
    while(std::cin >> s) { 
      int * arr = new int[s]; 
      for(int i = 0; i < s; i++) { 
        std::cin >> arr[i]; 
        std::cout << arr[i] << " "; 
      } 
      std::cout << "\n\n"; 
      delete[] arr; 
    } 

    std::cout << "CAN READ: " << (bool)(std::cin >> s) << std::endl 
       << "GOOD: "<< std::cin.good() << std::endl 
       << "EOF: "<< std::cin.eof() << std::endl 
       << "FAIL: "<< std::cin.fail() << std::endl 
       << "BAD: "<< std::cin.bad() << "\n\n"; 

    std::cin.clear(); 
    std::cin.ignore(INT_MAX); 

    std::cout << "GOOD: " << std::cin.good() << std::endl 
       << "EOF: " << std::cin.eof() << std::endl 
       << "FAIL: " << std::cin.fail() << std::endl 
       << "BAD: " << std::cin.bad() << "\n\n"; 

    std::cin.clear(); 

    std::cout << "GOOD: " << std::cin.good() << std::endl 
       << "EOF: " << std::cin.eof() << std::endl 
       << "FAIL: " << std::cin.fail() << std::endl 
       << "BAD: " << std::cin.bad() << "\n\n"; 

    std::cout << "Enter a #:\n"; 
    std::cin >> s; // unable to provide input (EDIT: from keyboard) here 
    std::cout << s << std::endl; 

    std::cout << "Program ends.\n"; 
    return 0; 
} 

La sortie est

GOOD: 1 
EOF: 0 
FAIL: 0 
BAD: 0 

1 2 3 4 5 6 7 8 9 10 

10 20 30 40 50 

CAN READ: 0 
GOOD: 0 
EOF: 1 
FAIL: 1 
BAD: 0 

GOOD: 0 
EOF: 1 
FAIL: 0 
BAD: 0 

GOOD: 1 
EOF: 0 
FAIL: 0 
BAD: 0 

Enter a #: 
5 
Program ends. 

Qu'est-ce que je manque ici? Pourquoi cin ne me permet-il pas de lui fournir une entrée même si sa mémoire tampon est vide et que le flux est dans un bon état? Que puis-je faire pour que cin accepte d'autres contributions ici?

+0

cin est redirigé vers le fichier ... Comment voulez-vous fournir l'entrée du fichier quand il a été lu jusqu'à la fin? –

Répondre

0

J'ai pensé qu'il était possible d'obtenir une entrée au clavier transparente après avoir redirigé un fichier vers cin (merci à Artemy Vysotsky de m'avoir aidé à comprendre que ce n'était pas le cas).

Pour toute personne rencontrant un problème similaire, std :: cin.rdbuf() peut être utilisé. Détails ici: Can std::cin switch from accepting file input to keyboard input at run-time?

0

utilisez cin.flush(); après avoir pris une entrée un nombre entier. Il va vider le flux et vous pouvez reprendre l'entrée de chaîne. Si vous voulez savoir pourquoi cela se produit, vous pouvez le lire here