2010-07-09 15 views
25

¿Cómo puedo obtener la longitud en bytes de un stringstream.Cómo obtener la longitud de std :: stringstream sin copiar

stringstream.str().length(); 

copiaría el contenido en std :: string. No quiero hacer una copia.

O si alguien puede sugerir otro iostream que funciona en la memoria, puede pasarse por escrito a otro ostream, y puede obtener el tamaño fácilmente lo usaré.

+1

Fwiw, cualquiera que sólo está interesado en si un 'stringstream' está vacía o no puede encontrar más fácil para comprobar [ 'ss.peek()! = decltype (ss) :: traits_type :: eof()'] (http://stackoverflow.com/a/34651454/410767). –

Respuesta

26

Suponiendo que está hablando de un ostringstream, parece que tellp podría hacer lo que quiera.

+0

Estoy usando http://www.cplusplus.com/reference/iostream/stringstream/ con el constructor (std :: ios_base :: in | std :: ios_base :: out | std :: ios_base :: binary). tellp() funciona. Gracias. – Budric

+19

Tenga en cuenta que 'tellp()' no tendrá en cuenta los caracteres iniciales. 'ostringstream oss (" hey "); cout << oss.tellp() << endl; 'mostrará' 0' y no '3'. – ereOn

+2

¿Alguien sabe por qué 'tellp()' no es const? Mi método '' size() 'que estoy escribiendo debería ser const, pero a clang no le gusta. Dice que 'tellp' no es const. ¿'Tellp' modifica el' stringstream'? ¿Por qué debería? –

4

Una solución que proporciona la longitud de la stringstream incluyendo cualquier cadena inicial previsto en el constructor:

#include <sstream> 
using namespace std; 

#ifndef STRINGBUFFER_H_ 
#define STRINGBUFFER_H_ 

class StringBuffer: public stringstream 
{ 
public: 
    /** 
    * Create an empty stringstream 
    */ 
    StringBuffer() : stringstream() {} 

    /** 
    * Create a string stream with initial contents, underlying 
    * stringstream is set to append mode 
    * 
    * @param initial contents 
    */ 
    StringBuffer(const char* initial) 
     : stringstream(initial, ios_base::ate | ios_base::in | ios_base::out) 
    { 
     // Using GCC the ios_base::ate flag does not seem to have the desired effect 
     // As a backup seek the output pointer to the end of buffer 
     seekp(0, ios::end); 
    } 

    /** 
    * @return the length of a str held in the underlying stringstream 
    */ 
    long length() 
    { 
     /* 
     * if stream is empty, tellp returns eof(-1) 
     * 
     * tellp can be used to obtain the number of characters inserted 
     * into the stream 
     */ 
     long length = tellp(); 

     if(length < 0) 
      length = 0; 

     return length; 

    } 
}; 
Cuestiones relacionadas