2010-07-09 3 views
25

Как получить длину в байтах строкового потока.Как получить длину std :: stringstream без копирования

stringstream.str().length(); 

скопировал бы содержимое в std :: string. Я не хочу делать копию.

Или, если кто-то может предложить другой iostream, который работает в памяти, может быть передан для записи в другой поток и может легко получить его размер, я буду использовать его.

+1

FWIW, кто заинтересован только в ли 'stringstream' пуст или не может найти его проще проверить [ 'ss.peek()! = decltype (ss) :: traits_type :: eof()'] (http://stackoverflow.com/a/34651454/410767). –

ответ

26

Предполагая, что вы говорите об ostringstream, похоже, что tellp может делать то, что вы хотите.

+0

Я использую http://www.cplusplus.com/reference/iostream/stringstream/ с конструктором (std :: ios_base :: in | std :: ios_base :: out | std :: ios_base :: binary). tellp() работает. Благодарю. – Budric

+19

Остерегайтесь, что 'tellp()' не будет рассматривать начальные символы. 'ostringstream oss (« эй »); cout << oss.tellp() << endl; 'будет показывать' 0', а не '3'. – ereOn

+2

Кто-нибудь знает, почему 'tellp()' не const? Мой метод 'size()', который я пишу, должен быть действительно const, но clang ему не нравится. В нем говорится, что 'tellp' не const. Изменяет ли 'tellp'' stringstream'? Почему это должно быть? –

4

Решение, которое обеспечивает длину stringstream включая любую исходную строку, указанную в конструкторе:

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

    } 
}; 
Смежные вопросы