Trực quan, đánh giá từ thông số C++, có vẻ như tôi istream::putback(c)
nên luôn sắp xếp bộ đệm đầu vào sao cho lệnh gọi tiếp theo là istream::peek()
phải đọc ký tự c
. Điều này có đúng không? Tôi hỏi vì phiên bản libC++ mới nhất với Xcode 4.6 dường như không thực thi hành vi này trong mọi trường hợp - đặc biệt khi ký tự cuối cùng ở EOF. Điều này cũng đúng nếu bạn sử dụng unget()
thay vì putback(c)
.Không nên istream :: peek() luôn trả về những gì bạn vừa bỏ lại()?
Hành vi của libC++ có đúng không, hoặc trực giác của tôi về cách putback()/unget()
có hoạt động chính xác không?
Hãy xem xét mã ví dụ này, hoạt động với libstdC++ nhưng không phải với libC++ (xác nhận không thành công).
#include <sstream>
#include <cassert>
int main(int argc, const char * argv[])
{
std::istringstream in("[Test]");
while(in)
{
int c = in.get();
if(c == ']')
{
in.putback(c);
assert(in.peek() == c); // Fails with libc++. Succeeds with libstdc++.
break;
}
}
return 0;
}
Có bất kỳ «eofbit',' failbit', 'badbit' nào được đặt sau' putback (c) 'không? (Để tham khảo: Với libstdC++ 4.7, không có gì trong số đó được thiết lập, luồng là 'good()'.) – us2012
+1 cho cả hai câu trả lời. Có vẻ như một lỗi trong libC++ đã được sửa trong r162608. –