2011-01-16 63 views
13

Trả lại phương thức istream::getline là gì?istream :: getline return type

Tôi hỏi vì tôi đã thấy rằng để lặp thông qua một tập tin, nó nên được thực hiện như thế này:

while (file.getline(char*, int)) 
{ 
    // handle input 
} 

gì đang được trả lại?

+0

istream & là loại trả về. – DumbCoder

+0

vâng, tôi nên nói rằng tôi đã biết điều đó. nhưng rõ ràng một cái gì đó là kỳ lạ về nó, bởi vì một số hình thức đúng hay sai có nguồn gốc từ nó. –

+0

Nó quá tải hoặc là toán tử 'bool' hoặc' void * 'sao cho khi nó được ngầm sử dụng trong điều kiện if(), nó có thể trả về cho dù EOF đã đạt hay không – Cameron

Trả lời

15

Nó trả về một luồng để chúng tôi có thể chuỗi hoạt động.

Nhưng khi bạn sử dụng một đối tượng trong ngữ cảnh boolean, trình biên dịch tìm kiếm toán tử chuyển đổi có thể chuyển đổi nó thành kiểu có thể được sử dụng trong ngữ cảnh boolean.

Trong trường hợp này, luồng có operator void*(). Vì điều này dẫn đến một con trỏ, nó có thể được sử dụng trong một bối cảnh boolean. Khi được gọi nó sẽ kiểm tra các cờ lỗi. Nếu một trong hai failbit hoặc badbit được thiết lập thì nó trả về NULL tương đương với FALSE nếu không nó sẽ trả về một con trỏ đến tự (hoặc một cái gì đó khác hợp lệ mặc dù bạn không nên sử dụng thực tế này)).

Vì vậy, bạn có thể sử dụng một dòng suối trong bất kỳ bối cảnh đó sẽ yêu cầu xét nghiệm boolean:

if (stream >> x) 
{  
} 

while(stream) 
{ 
    /* do Stuff */ 
} 

Lưu ý: Đây là ý tưởng tồi để kiểm tra dòng bên ngoài và sau đó đọc/ghi dữ liệu lên bên trong cơ thể của câu lệnh điều kiện/vòng lặp. Điều này là do hành vi đọc có thể khiến luồng dữ liệu trở nên tồi tệ. Nó thường là tốt hơn để làm đọc như là một phần của thử nghiệm.

while(std::getline(steam, line)) 
{ 
    // The read worked and line is valid. 
} 
5

Nhìn từ reference. Dòng istream được trả về từ getline được chuyển thành bool bởi implicit conversion để kiểm tra thành công của hoạt động. Chuyển đổi đó sử dụng số if(mystream.getline(a,b)) để viết tắt cho if(!mystream.getline(a,b).fail()).

+0

Liên kết của bạn không chứa gì khớp với câu lệnh của bạn. – iheanyi

+0

@iheanyi Đã thêm làm rõ, có lẽ các trang đã thay đổi theo thời gian. –

+0

Cảm ơn, tôi đã bình chọn câu trả lời của bạn với thay đổi đó. – iheanyi

2

Hàm trả về một tham chiếu đến các đối tượng dòng riêng của mình, có thể được sử dụng hoặc để chuỗi đọc thêm hoạt động:

myStream.getline(...).getline(...); 

hoặc, bởi vì con suối đang ngầm chuyển đổi thành void * s, trong một vòng lặp hoặc điều kiện:

while (myStream.getline(...)) { 
    ... 
} 

Bạn có thể đọc thêm về điều này trên trang web cplusplus.com:

http://cplusplus.com/reference/iostream/istream/getline/

2

Nó trả về chính luồng đó. Luồng có thể chuyển đổi (thông qua void*) thành bool cho biết trạng thái của luồng. Trong ví dụ này, vòng lặp while của bạn sẽ chấm dứt khi chuyển đổi của luồng thành bool bị "sai", điều này xảy ra khi luồng của bạn vào trạng thái lỗi. Trong mã của bạn, nó rất có thể xảy ra khi có một nỗ lực để đọc qua cuối tập tin. Trong ngắn hạn, nó sẽ đọc nhiều như có, và sau đó dừng lại.

+0

+1. Nó có thể chuyển đổi thành bool vì nó quá tải toán tử 'bool()' (hoặc 'toán tử void *()', không chắc chắn) – Cameron

+0

@Cameron: Đó là 'toán tử void *()'. –

0

Mọi người đã nói với bạn nó là gì, bây giờ hãy để tôi nói cho bạn, sử dụng phiên bản free form

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream 
{ 
// 
} 

Tại sao phiên bản này? Nó sẽ trở nên rõ ràng ngay lập tức - bạn vượt qua trong một std::string thay vì một số bộ đệm ký tự kích thước cố định!

+0

nhưng nếu bạn muốn 'char *' thay vì 'std :: string' thì sao? đó là tình huống tôi đang ở. –

+0

'std :: string' có phương thức' c_str() 'sẽ trả về cho bạn những gì bạn yêu cầu, nếu bạn cần thay đổi chuỗi, thì có phương thức' std :: string' bạn có thể sử dụng để sửa đổi nó. – Nim

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