2015-11-21 1 views
2

Donc j'expérimente avec stringstream en C++ et je me demande pourquoi input3 resterait le même. Si j'ai entré: "test", "testing" et "tester", input1, input2, et input3 auraient respectivement leur variable de chaîne correspondante. Mais quand je re-entrer dans les valeurs disons seulement "test" et "testing", la variable "testeur" serait toujours dans le flux de l'entrée précédente. Comment puis-je l'effacer? Toute aide serait grandement appréciée. Merci!Comment réutiliser un stringstream en C++?

#include <iostream> 
#include <string> 
#include <sstream> 

int main(){ 
    std::string input, input1, input2, input3; 
    std::string x, y, z; 
    std::string other; 
    std::getline(std::cin, input); 
    std::istringstream getter{input}; 
    getter >> input1 >> input2 >> input3; 
    while (input1 != "break"){ 
     if (input1 == "test"){ 
      function(input2, input3); 
      std::getline(std::cin, other); //receive more input 
      getter.str(other); 
      getter >> x >> y >> z; //get new data 
      input1 = x; input2 = y; input3 = z; //check against while loop 
     } 

     else{ 
      std::cout << "WRONG!" << std::endl; 
      std::getline(std::cin, input); 
      getter >> input1 >> input2 >> input3; 

     } 
    } 
    return 0; 
} 
+0

'getter.str (std :: string())' devrait faire l'affaire. (à condition que ce soit le flux que vous essayez d'effacer) Faites-moi savoir si cela ne fonctionne pas pour vous. – Phixle

+0

Que diriez-vous d'une [affectation] simple (http://en.cppreference.com/w/cpp/io/basic_istringstream/operator%3D) comme 'getter = std :: istringstream {otherinput}'? –

+0

@Phixle J'ai essayé ça et ça n'a pas marché. Est-il possible de supprimer un flux, de recevoir des entrées et de l'insérer dans le même flux avec les mêmes variables? – programmer2222

Répondre

2

Le programme ci-dessous montre comment changer le string associé à un stringstream et l'extraction de données de la nouvelle string.

#include <iostream> 
#include <string> 
#include <sstream> 

int main() 
{ 
    std::string input1 = "1 2"; 
    std::string input2 = "10 20"; 

    std::istringstream iss{input1}; 
    int v1 = 0, v2 = 0; 

    // Read everything from the stream. 
    iss >> v1 >> v2; 
    std::cout << "v1: " << v1; 
    std::cout << ", v2: " << v2 << std::endl; 

    // Reset the string associated with stream. 
    iss.str(input2); 

    // Expected to fail. The position of the stream is 
    // not automatically reset to the begining of the string. 
    if (iss >> v1 >> v2) 
    { 
     std::cout << "Should not come here.\n"; 
    } 
    else 
    { 
     std::cout << "Failed, as expected.\n"; 

     // Clear the stream 
     iss.clear(); 

     // Reset its position. 
     iss.seekg(0); 

     // Try reading again. 
     // It whould succeed. 
     if (iss >> v1 >> v2) 
     { 
     std::cout << "v1: " << v1; 
     std::cout << ", v2: " << v2 << std::endl; 
     } 
    } 

    return 0; 
} 

sortie, avec g ++ 4.8.4 sur Linux:

v1: 1, v2: 2 
Failed, as expected. 
v1: 10, v2: 20 
+0

Est-il possible de continuer à recevoir une entrée dans une boucle while (l'entrée étant le même nom de variable), effacer le flux et continuer à insérer de nouvelles entrées? – programmer2222

+1

Je ne pense pas que seekg soit nécessaire - '.str()' implique de réaffirmer le mode ouvert du flux –