web-dev-qa-db-fra.com

comment réutiliser stringstream

Ces discussions ne me répondent pas:

réinitialisation d'un string

Comment effacez-vous une variable stringstream?

        std::ifstream file( szFIleName_p );
        if( !file ) return false;

        // create a string stream for parsing

        std::stringstream szBuffer;

        std::string szLine;     // current line
        std::string szKeyWord;  // first Word on the line identifying what data it contains

while( !file.eof()){

            // read line by line

            std::getline(file, szLine);

            // ignore empty lines

            if(szLine == "") continue;

            szBuffer.str("");
            szBuffer.str(szLine);
            szBuffer>>szKeyWord;

szKeyword contiendra toujours le premier mot, szBuffer n'est pas réinitialisé, impossible de trouver un exemple clair sur l'utilisation de stringstream.

Nouveau code après réponse:

...
            szBuffer.str(szLine);
            szBuffer.clear();
            szBuffer>>szKeyWord;
...

Ok, c'est ma version finale:

        std::string szLine;     // current line
        std::string szKeyWord;  // first Word on the line identifying what data it contains

        // read line by line

        while( std::getline(file, szLine) ){

            // ignore empty lines

            if(szLine == "") continue;

            // create a string stream for parsing

            std::istringstream szBuffer(szLine);
            szBuffer>>szKeyWord;
16
Icebone1000

Vous n'avez pas clear() le flux après avoir appelé str(""). Jetez un autre regard sur cette réponse , cela explique également pourquoi vous devez réinitialiser avec str(std::string()). Et dans votre cas, vous pouvez également réinitialiser le contenu en utilisant uniquement str(szLine).

Si vous n'appelez pas clear(), les drapeaux du flux (comme eof) ne seront pas réinitialisés, ce qui entraînerait un comportement surprenant;)

26
Marcus Riemer

Cela dépend de ce que vous en faites. Il est généralement plus facile de simplement Créer une nouvelle istringstream ou ostringstream. Pour "réinitialiser" un flux, Vous devez vider son tampon, supprimer tout indicateur d'erreur, réinitialiser tout indicateur de formatage , Ainsi que la précision et le remplissage et le reimbue avec le paramètres régionaux d'origine, sans oublier les informations de formatage étendues générées avec une valeur renvoyée par xalloc. En résumé, impossible de Se corriger. 

Et tant que j'y suis, votre boucle est fausse et entraînera probablement le traitement de la dernière ligne À deux reprises. file.eof() a seulement une signification utilisable après l'échec de l'entrée (et même dans ce cas, ce n'est pas fiable à 100%). Ce que vous voulez, c'est:

std::string line;
while ( std::getline( file, line ) ) {
    if ( !line.empty() ) {
        std::istringstream buffer( line );
        //  ...
    }
}

(En fait, vous voudrez probablement supprimer l’espace blanc derrière la ligne Avant le test de vide.)

8
James Kanze

Dans la plupart des cas, il est plus facile de créer une nouvelle istringstream ou ostringstream au lieu de réinitialiser les mêmes.

Cependant, si vous voulez les renvoyer:

  • Indicateurs renvoyés du flux (pour éviter tout comportement inattendu) à l'aide de clear ().

  • Bien que vous puissiez corriger le contenu de votre stringstream à l'aide de str (""), pour des raisons d'efficacité, nous préférerions peut-être str(std::string()).

1
Madhav Datt

Si vous avez le flux dans un membre du groupe, Utilisez unique_ptr<stringstream>, , Puis reset(new stringstream(...)) pour le réutiliser.

0

ss est stringstream. Utilisation 

  • première étape: ss.clear ();
  • deuxième étape: ss.str ("");

réutiliser le stringstream - efface complètement le flux de la chaîne.

0
user5732391

Imaginez un fichier de configuration. 

par1=11
par2=22

codes:

std::string line, strpar1, strpar2;
int par1, par2;
std::ifstream configfile("config.cfg");

std::getline(configfile, line);    // first line to variable "line"
std::istringstream sline(line);
while (std::getline(sline, strpar1, '='));
par1 = std::stoi(strpar1);  // par1 get 11

bool b = sline.eof(); // true

std::getline(configfile, line);    // second line to variable "line"
sline.clear();    //
sline.str(line);    // reuse "sline"

b = sline.good();  // true  // goodbit is zero, indicating that none of the other bits is set.
b = sine.fail();  // false
b = sline.bad();  // false
b = sline.eof(); // false

while (std::getline(sline, strpar2, '='));
par2 = std::stoi(strpar2);  // par2 get 22

goodbit vaut zéro, ce qui indique qu'aucun des autres bits n'est défini

0
Nick Dong