2009-01-31 30 views
16

Cách tối ưu nhất để có được một chuỗi hoặc con trỏ char * vào một istream.Cách tối ưu để nhận chuỗi hoặc char * vào luồng?

Tôi muốn làm như sau

std::string a = "abc.."; 

//I know this can be done, not sure if this is most efficient 
// and not sure about char* pointers 
std::istringstream istr (a); 
... 
foo (istr); 


void foo(std::istream& is) { 

} 
+0

Xin lỗi; nó không hoàn toàn rõ ràng những gì bạn đang yêu cầu ở đây. Bạn có muốn truy cập chuỗi như thể đó là luồng không? Bạn đang cố gắng để thực hiện? – Rob

+0

đã chỉnh sửa câu hỏi ngay bây giờ. – kal

+0

tôi nên lưu ý rằng mã của bạn không hợp lệ. bạn không thể xây dựng một istream từ một istringstream. bạn nghĩ nó nên làm gì (lưu ý, không thể sao chép luồng). –

Trả lời

12

này sẽ làm việc:

std::istringstream is("abc..."); 

Và kể từ istringstream là một istream, bạn sẽ có thể sử dụng là của bạn đối tượng như một istream.

+0

Điều này có vẻ là câu trả lời rõ ràng - hoặc là OP thực sự yêu cầu cái gì khác? –

+0

Tôi cũng đang tìm kiếm điều này và không biết nó sẽ dễ dàng như vậy. luồng rất khó nếu bạn không biết chúng :) –

15

Nếu bạn muốn xây dựng một istringstream từ nó, một char * lên đến các ký tự null, hoặc tất cả những thứ từ một std :: string:

istringstream str(ptr); // char* 
istringstream str(other_str); // std::string 

Nếu bạn nói về mong muốn một con trỏ thô thành bộ đệm của một istream, bạn không thể làm điều đó. Các luồng có được dữ liệu theo yêu cầu nếu chúng cần chúng từ các tệp, thiết bị đầu cuối hoặc người nào khác, tùy chọn đệm các công cụ của chúng (tốt, không chính xác. Bạn có thể sử dụng strstream, chấp nhận con trỏ thô và đọc/ghi trực tiếp từ đó. đó là một lớp không được chấp nhận - không sử dụng nó. Tôi may mắn là tôi chưa bao giờ làm vậy). Nếu tất cả những gì bạn muốn là một cái gì đó bạn có thể sử dụng phần nào giống như một con trỏ, bạn có thể sử dụng các trình lặp vòng lặp streambuf. Họ không thực sự con trỏ mặc dù, vì vậy bạn không thể trừ end từ begin và chất liệu khác:

std::istreambuf_iterator<char> begin(one_istream), end; 
while(begin != end) 
    std::cout << *begin++; 

Nếu bạn nói về nhận được một chuỗi ra khỏi những gì đã được viết thành một stringstream, bạn có thể sử dụng ostringstream::str:

ostringstream o; 
o << "This is a number: " << 42; 
std::string str = o.str(); // str == "This is a number: 42" 

Nếu không, bạn chỉ có thể thường là đọc nội dung từ số istream. Bạn cần số ostream, sau đó bạn có thể làm

stream.write(ptr, N); 
stream.write(ptr.c_str(), ptr.c_str() + ptr.size()); 

để viết chính xác N ký tự từ các byte trỏ tới. Bạn cũng có thể viết nó vào luồng bằng cách sử dụng <<. Nó sẽ viết mọi thứ lên đến ký tự rỗng, hoặc mọi thứ từ chuỗi std ::, nhưng sẽ tôn trọng các cờ định dạng, như chiều rộng trường:

stream << ptr; // char* 
stream << other_str; // everything from std::string 
Các vấn đề liên quan