2013-01-18 35 views
6

Hãy nói rằng tôi có một tập tin mà cóKiểm tra xem tất cả các giá trị đã được đọc thành công từ std :: istream

100 text 

Nếu tôi cố gắng đọc 2 số sử dụng ifstream, nó sẽ thất bại vì text không phải là số. Sử dụng fscanf Tôi sẽ biết nó không thành công bằng cách kiểm tra mã trả về của nó:

if (2 != fscanf(f, "%d %d", &a, &b)) 
    printf("failed"); 

Nhưng khi sử dụng iostream thay vì stdio, làm sao tôi biết nó không thành công?

Trả lời

11

của nó thực sự là (nếu không nói là hơn) đơn giản:

ifstream ifs(filename); 
int a, b; 
if (!(ifs >> a >> b)) 
    cerr << "failed"; 

Get sử dụng để định dạng đó, bằng cách này. vì nó có ở rất tiện dụng (thậm chí nhiều hơn để tiếp tục tích cực tiến triển thông qua các vòng lặp).

3

Nếu một' sử dụng GCC với -std=c++11 hoặc -std=c++14 cô có thể gặp phải:

error: cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ 

Tại sao? Tiêu chuẩn C++ 11 được thực hiện bool cuộc gọi của nhà điều hành rõ ràng (ref). Vì vậy nó là cần thiết để sử dụng:

std::ifstream ifs(filename); 
int a, b; 
if (!std::static_cast<bool>(ifs >> a >> b)) 
    cerr << "failed"; 

Cá nhân tôi thích dưới đây sử dụng các chức năng fail:

std::ifstream ifs(filename); 
int a, b; 
ifs >> a >> b 
if (ifs.fail()) 
    cerr << "failed"; 
Các vấn đề liên quan