Diese Threads antworten mir NICHT:
einen Stringstream zurücksetzen
Wie löscht man eine Stringstream-Variable?
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
enthält immer das erste Word, szBuffer
wird nicht zurückgesetzt und kann nirgendwo ein klares Beispiel für die Verwendung von Stringstream finden.
Neuer Code nach Antwort:
...
szBuffer.str(szLine);
szBuffer.clear();
szBuffer>>szKeyWord;
...
Ok, das ist meine endgültige Version:
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;
Sie haben den Stream nicht nach dem Aufruf von clear()
str("")
. Werfen Sie einen weiteren Blick auf diese Antwort , es erklärt auch, warum Sie mit str(std::string())
zurücksetzen sollten. In Ihrem Fall können Sie den Inhalt auch nur mit str(szLine)
zurücksetzen.
Wenn Sie nicht clear()
aufrufen, werden die Flags des Streams (wie eof
) nicht zurückgesetzt, was zu einem überraschenden Verhalten führt;)
Es kommt darauf an, was du damit machst. Im Allgemeinen ist es einfacher, einfach Eine neue istringstream
oder ostringstream
zu erstellen. Um einen Stream "zurückzusetzen", , Müssen Sie den Puffer löschen, alle Fehlerflags löschen, alle Formatierungsflags Sowie die Genauigkeit und die Füllung zurücksetzen und mit dem Original Reimbue
erneut angeben locale, und vergessen Sie keine erweiterten Formatierungsinformationen , die mit einem von xalloc
zurückgegebenen Wert generiert wurden. In der Summe ist es unmöglich, Richtig zu machen.
Und wenn ich gerade dabei bin, ist Ihre Schleife falsch und wird wahrscheinlich dazu führen, dass die letzte Zeile Zweimal verarbeitet wird. file.eof()
hat nur eine verwendbare Bedeutung , nachdem die Eingabe fehlgeschlagen ist (und selbst dann ist sie nicht 100% zuverlässig). Was Sie wollen, ist:
std::string line;
while ( std::getline( file, line ) ) {
if ( !line.empty() ) {
std::istringstream buffer( line );
// ...
}
}
(Eigentlich möchten Sie wahrscheinlich den Leerraum von der Zeile Vor dem Test auf Leerzeichen abschneiden.)
In den meisten Fällen ist es einfacher, eine neue istringstream
oder ostringstream
zu erstellen, anstatt dieselben zurückzusetzen.
Wenn Sie sie jedoch ablehnen möchten:
Erneutes Senden von Flags des Streams (um unerwartetes Verhalten zu vermeiden) mit clear ()
.
Sie können zwar den Inhalt Ihrer stringstream
mit str ("")
korrigieren, aus Effizienzgründen empfehlen wir str(std::string())
.
Wenn Sie den Stream in einem Klassenmitglied haben, verwenden Sie unique_ptr<stringstream>
, Und dann reset(new stringstream(...))
, um ihn wiederzuverwenden.
ss ist stringstream. Benutzen
um den String-Stream wiederzuverwenden, löschen Sie den String-Stream vollständig.
Stellen Sie sich eine Konfigurationsdatei vor.
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 ist Null, was anzeigt, dass keines der anderen Bits gesetzt ist