2008-11-03 33 views
25

Tôi có một vòng lặp đọc từng dòng trong một tệp bằng cách sử dụng getline().std :: getline() trả về

istream is; 
string line; 
while (!getline(is, line).eof()) 
{ 
} 

tôi nhận thấy rằng getline gọi() như thế này cũng dường như làm việc:

while (getline(is, line)) 

gì đang xảy ra ở đây? getline() trả về một tham chiếu luồng. Nó đang được chuyển đổi thành một con trỏ bằng cách nào đó? Đây thực sự là một thực hành tốt hay tôi nên dính vào hình thức đầu tiên?

Trả lời

26

Dòng istream được trả về bởi getline() có phương thức void *() của toán tử được gọi ngầm, trả về xem luồng có gặp lỗi không. Vì vậy, nó thực hiện kiểm tra nhiều hơn một cuộc gọi đến eof().

+0

Charles đúng, bạn cũng đang nhầm lẫn với nhà điều hành do lính gác cung cấp. –

+0

Đã xóa bài đăng cuối cùng của tôi trong khi tôi đã viết bài kiểm tra. Bây giờ tôi khá chắc chắn nó phôi để bool. –

+0

Trừ khi việc triển khai SL của bạn không chuẩn, nó sẽ bỏ trống *. Đó là những gì tiêu chuẩn yêu cầu. –

8

Cập nhật:

tôi đã nhầm lẫn chỉ vào basic_istream documentation cho phương pháp điều hành bool() trên lớp basic_istream :: sentry, nhưng như đã được chỉ ra đây không phải là thực tế những gì đang xảy ra. Tôi đã bỏ phiếu cho câu trả lời đúng của Charles và Luc. Nó thực sự là nhà điều hành void *() đó là nhận được gọi là. Thêm thông tin về số này in the C++ FAQ.

+0

Bạn đang nhầm lẫn với sentry với basic_ios :: operator void *() -> http://dinkumware.com/ hướng dẫn sử dụng/default.aspx? manual = compleat & page = ios.html # basic_ios :: toán tử% 20void% 20 * –

+0

Điểm tốt. Tôi cũng đứng sửa chữa. – tgamblin

+1

liên kết của bạn đã chết – qdii

-3

Tôi sẽ kết hợp với biểu mẫu đầu tiên. Trong khi hình thức thứ hai có thể hoạt động, nó hầu như không rõ ràng. Mã ban đầu của bạn mô tả rõ ràng những gì đang được thực hiện và nó được mong đợi như thế nào để hành xử.

+0

Luồng có thể không tốt và không phải eof(). Nếu bạn muốn rõ ràng, bạn có thể gọi tốt(). – tgamblin

+0

Có, bạn đã đúng. Nó sẽ là tốt nhất để sử dụng hình thức đầu tiên, nhưng với một cuộc gọi đến .good() thay vì .eof() –

+2

Cá nhân tôi thích việc sử dụng các diễn viên tiềm ẩn để bool. Nó trông giống như tất cả các ngôn ngữ khác ra khỏi đó mà lặp qua dòng. –

5

Charles đã cung cấp số correct answer.

gì được gọi là thực sự std::basic_ios::operator void*(), và không sentry::operator bool() là, đó là nhất quán với thực tế là std::getline() trả về một std::basic_istream (do đó, một std::basic_ios), và không phải là một lính gác.

Đối với các tín đồ phi, xem:

Nếu không, như người khác đã nói, hãy thích biểu mẫu thứ hai h là kinh điển. Sử dụng không fail() nếu bạn thực sự muốn có một mã tiết - Tôi không bao giờ nhớ liệu có thể sử dụng xxx.good() thay vì !xxx.fail()

+0

Thật vậy. dinkumware đã xóa tài liệu trực tuyến của mình. Đã sửa liên kết. Cảm ơn. –

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