Search code examples
c++istringstream

How to save and restore an std::istringstream's buffer?


I am using a istringstream to read a string word by word. However, when my condition fails I need to be able to revert the istringstream to before the previous word was read. My example code works, but I want to know if there is a more direct way to use streams to accomplish this.

std::string str("my string");
std::istringstream iss(str);

std::ostringstream ossBackup << iss.rdbuf(); // Writes contents of buffer and in the process changes the buffer
std::string strBackup(ossBackup.str());      // Buffer has been saved as string

iss.str(strBackup);                          // Use string to restore iss's buffer
iss.clear();                                 // Clear error states
iss >> word;                                 // Now that I have a backup read the 1st word ("my" was read)

// Revert the `istringstream` to before the previous word was read.
iss.str(strBackup);                         // Restore iss to before last word was read
iss.clear();                                // Clear error states
iss >> word;                                // "my" was read again

Solution

  • You can use tellg() and seekg() to save and restore your position if you like:

    #include <string>
    #include <sstream>
    
    int main()
    {
        std::istringstream iss("some text");
    
        std::string word;
    
        // save the position
        std::streampos pos = iss.tellg();
    
        // read a word
        if(iss >> word)
            std::cout << word << '\n';
    
        iss.clear(); // clear eof or other errors
        iss.seekg(pos); // move to saved position
    
        while(iss >> word)
            std::cout << word << '\n';
    
    }