web-dev-qa-db-de.com

wie man stringstream wiederverwendet

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;
16
Icebone1000

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;)

26
Marcus Riemer

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.)

8
James Kanze

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()).

1
Madhav Datt

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 

  • erster Schritt: ss.clear ();
  • zweiter Schritt: ss.str ("");

um den String-Stream wiederzuverwenden, löschen Sie den String-Stream vollständig.

0
user5732391

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

0
Nick Dong