2010-09-21 33 views
6

Tôi muốn thử nghiệm với stringstream cho một bài tập, nhưng tôi hơi bối rối về cách nó hoạt động. Tôi đã tìm kiếm nhanh nhưng không thể tìm thấy bất cứ điều gì có thể trả lời câu hỏi của tôi.cách đọc chuỗi video với kích thước động?

Giả sử tôi có luồng có kích thước động, làm cách nào tôi biết khi nào nên dừng ghi vào biến?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

và đầu ra của tôi sẽ là:

2 
++ 
asdf 
3 
* 
c 
c 

Tôi không chắc chắn lý do tại sao tôi nhận được rằng thêm 'c' ở cuối, đặc biệt là kể từ khi _M_in_cur = 0x1001000d7 ""

+0

Thực tế rằng đó là một chuỗi không thay đổi nhiều thứ gì - bạn đọc từ nó giống như bất kỳ luồng nào khác. –

Trả lời

17

Bạn nhận được thêm c ở cuối bởi vì bạn không kiểm tra xem luồng có còn hiệu quả sau khi bạn thực hiện trích xuất hay không:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

Bạn cần kiểm tra trạng thái luồng giữa khi bạn thực hiện thao tác trích xuất và khi bạn sử dụng kết quả. Thông thường, việc này được thực hiện bằng cách thực hiện thao tác trích xuất trong điều kiện vòng lặp:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

Cảm ơn, tôi đoán câu hỏi của tôi đáng lẽ phải được phân tích như cách kiểm tra điều kiện của luồng. –

+0

@ thomast.sang chấp nhận câu trả lời của anh ấy. – gsamaras

-1

Có chức năng thành viên tốt() kiểm tra xem luồng có thể được sử dụng cho hoạt động I/O hay không. Vì vậy, việc sử dụng mã ở trên có thể được thay đổi thành

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

Điều này vẫn không chính xác trong trường hợp chung: nếu bạn đang cố gắng trích xuất một 'int' và các ký tự có sẵn tiếp theo trong bộ đệm không thể được đọc dưới dạng' int', thì việc trích xuất sẽ thất bại. –

0

Điều kiện while(ss) kiểm tra mã của bạn nếu lần đọc cuối cùng từ luồng thành công hay không. Tuy nhiên, kiểm tra này sẽ trở lại đúng ngay cả khi bạn đã đọc từ cuối cùng trong chuỗi của bạn. Chỉ việc khai thác tiếp theo ss >> var trong mã của bạn sẽ làm cho điều kiện này sai khi kết thúc luồng đã đạt đến & không có gì để trích xuất vào biến var. Đây là lý do bạn nhận được thêm 'c' ở cuối. Bạn có thể loại bỏ điều này bằng cách thay đổi mã của bạn theo đề xuất của James McNellis.

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