2012-06-28 41 views
6

Tôi có câu hỏi hơi giống với câu hỏi này trên stackoverflow std::cin.clear() fails to restore input stream in a good state, nhưng câu trả lời được cung cấp ở đó không có tác dụng đối với tôi.Đặt lại trạng thái của luồng

Câu hỏi đặt ra là: làm cách nào để đặt lại trạng thái của luồng thành 'tốt'?

Đây là mã của tôi làm thế nào tôi thử nó, nhưng nhà nước không bao giờ được thiết lập để tốt một lần nữa. Tôi sử dụng cả hai dòng bỏ qua một cách riêng biệt.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int result; 
    while (std::cin.good()) 
    { 
     std::cout << "Choose a number: "; 
     std::cin >> result; 

     // Check if input is valid 
     if (std::cin.bad()) 
     { 
      throw std::runtime_error("IO stream corrupted"); 
     } 
     else if (std::cin.fail()) 
     { 
      std::cerr << "Invalid input: input must be a number." << std::endl; 
      std::cin.clear(std::istream::failbit); 
      std::cin.ignore(); 
      std::cin.ignore(INT_MAX,'\n'); 
      continue; 
     } 
     else 
     { 
      std::cout << "You input the number: " << result << std::endl; 
     } 
    } 
    return 0; 
} 

Trả lời

11

Mã đây

std::cin.clear(std::istream::failbit); 

không thực sự rõ ràng failbit, nó thay thế tình trạng hiện thời của con suối với failbit.

Để xóa tất cả các bit, chỉ cần gọi clear().


Mô tả trong tiêu chuẩn là một chút phức tạp, tuyên bố là kết quả của các chức năng khác

void clear(iostate state = goodbit);

hậu: Nếu rdbuf()!=0 sau đó state == rdstate(); khác rdstate()==(state | ios_base::badbit).

Về cơ bản, lệnh gọi tiếp theo là rdstate() sẽ trả về giá trị được chuyển đến clear(). Ngoại trừ khi có một số vấn đề khác, trong trường hợp đó bạn cũng có thể nhận được badbit.

Ngoài ra, goodbit thực sự không có chút gì, nhưng có giá trị bằng 0 để xóa tất cả các bit khác.

Để xóa chỉ một chút cụ thể, bạn có thể sử dụng cuộc gọi

cin.clear(cin.rdstate() & ~ios::failbit); 

này Tuy nhiên, nếu bạn xóa một lá cờ và những người khác vẫn còn, bạn vẫn không thể đọc từ stream. Vì vậy, việc sử dụng này khá hạn chế.

+0

Trong sách của tôi, nội dung: rõ ràng (cờ) đặt trạng thái trạng thái được chỉ định thành hợp lệ. Tôi giải thích điều này là: xóa bit lỗi được chỉ định. Điều này là không chính xác sau đó? – physicalattraction

+0

Nó chỉ là 'clear()' để xóa * tất cả * cờ. Để xóa một lá cờ đơn lẻ phức tạp hơn một chút (và không quá hữu ích). Tôi đã thêm một phần mới vào câu trả lời của mình. –

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