2010-02-16 55 views
5

Tôi muốn đọc từ luồng bằng cách sử dụng std::getline bên trong vòng lặp for.đọc an toàn từ luồng trong vòng lặp for bằng cách sử dụng getline

Luồng tôi ngụ ý là một lớp được kế thừa từ std::basic_iostream.

 
std::string line;    
for(;;){ 
     try{ 
      std::getline(myStreamObj, line); 
      if(line != ""){ 
       std::cout << line << std::endl; 
      } 
     } 
     catch(std::ios_base::failure& ex){ 
      std::cout << ex.what() << std::endl; 
     } 
    } 

Tôi cũng muốn kiểm tra chống lại điều kiện lỗi khác như

eofbit failbit badbit

Nhưng tôi chút nhầm lẫn về điều đó.

Nếu một số điều kiện cài đặt 3 cờ này được đáp ứng thì có bất kỳ ngoại lệ nào được ném như std::ios_base::failure không? Làm thế nào để handlse những 3 trường hợp? Tôi có phải kiểm tra các cách khác không?

Cảm ơn AFG

Trả lời

2

Nếu bạn muốn chụp các lỗi thông qua ngoại lệ bạn cần phải cài đặt nó sử dụng ios :: ngoại lệ. Nếu không, một ngoại lệ sẽ không được ném. Bạn có thể xem tài liệu tại đây: http://www.cplusplus.com/reference/iostream/ios/exceptions/.

Bạn cũng có thể gọi ios :: fail(), ios :: bad() hoặc ios :: eof() một cách rõ ràng. Tài liệu tại đây: http://www.cplusplus.com/reference/iostream/ios/

6

Các iostreams theo mặc định không ném ngoại lệ khi lỗi xảy ra. Nếu bạn muốn bật chúng:

cout.execeptions(std::ios::badbit); 

sẽ bật ngoại lệ nếu badbit được đặt.

Để kích hoạt tất cả:

cout.execeptions(std::ios::badbit 
        | std::ios::eofbit 
        | std::ios::failbit); 

Các trường hợp ngoại lệ ném là kiểu:

std::ios_base::failure 

mà có nguồn gốc từ std::exception.

Nhìn chung, mặc dù nó là dễ dàng hơn không sử dụng execptions, nhưng để sử dụng các cấu trúc như:

while(std::getline(myStreamObj, line)) { 
    // process line 
} 
+0

Cảm ơn bạn đã trả lời! Tôi không biết về tình trạng này để nó có ích. Tôi có thể hỏi bạn một chi tiết nhỏ hơn không. Tại sao ngoại lệ không phải là lựa chọn tốt ở đây? –

+0

@Abruzzo Rất nhiều lý do - chậm hơn, không dễ dàng hỗ trợ nối lại, cần viết thêm mã để xử lý lỗi. Và hầu hết mọi người đọc mã của bạn sẽ mong đợi ngoại lệ * không * được sử dụng trong khu vực này, vì vậy họ sẽ tìm thấy mã khó hiểu hơn. –

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