2010-07-09 34 views
25

Làm cách nào để nhận được độ dài tính bằng byte của chuỗi.Cách lấy độ dài std :: stringstream mà không cần sao chép

stringstream.str().length(); 

sẽ sao chép nội dung thành chuỗi std ::. Tôi không muốn làm một bản sao. Hoặc nếu bất cứ ai có thể đề xuất một iostream khác hoạt động trong bộ nhớ, có thể được thông qua để viết cho một ostream khác, và có thể nhận được kích thước của nó một cách dễ dàng tôi sẽ sử dụng nó.

+1

FWIW, bất cứ ai chỉ quan tâm đến việc liệu một 'stringstream' rỗng hoặc không thể tìm thấy nó dễ dàng hơn để kiểm tra [ 'ss.peek()! = decltype (ss) :: traits_type :: eof()'] (http://stackoverflow.com/a/34651454/410767). –

Trả lời

26

Giả sử bạn đang nói về một số ostringstream có vẻ như tellp có thể làm những gì bạn muốn.

+0

Tôi đang sử dụng http://www.cplusplus.com/reference/iostream/stringstream/ với kiến ​​trúc (std :: ios_base :: in | std :: ios_base :: out | std :: ios_base :: binary). tellp() hoạt động. Cảm ơn. – Budric

+19

Hãy coi chừng rằng 'tellp()' sẽ không xem xét các ký tự đầu tiên. 'ostringstream oss (" hey "); cout << oss.tellp() << endl; 'sẽ hiển thị' 0' chứ không phải '3'. – ereOn

+2

Có ai biết tại sao 'tellp()' không phải là const? Phương thức 'size()' của tôi là viết nên thực sự là const, nhưng clang không thích nó. Nó nói rằng 'tellp' không phải là const. Liệu 'tellp' sửa đổi' stringstream'? Tại sao nên làm thế? –

4

Một giải pháp cung cấp độ dài của stringstream bao gồm bất kỳ chuỗi ban đầu được cung cấp trong các nhà xây dựng:

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

    } 
}; 
Các vấn đề liên quan