Ces discussions ne me répondent pas:
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;
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;)
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.)
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())
.
Si vous avez le flux dans un membre du groupe, Utilisez unique_ptr<stringstream>
, , Puis reset(new stringstream(...))
pour le réutiliser.
ss est stringstream. Utilisation
réutiliser le stringstream - efface complètement le flux de la chaîne.
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