2010-08-30 37 views
7

Tôi đang chạy bản thân mình thông qua một cuốn sách văn bản C + + mà tôi có như là một refresher để lập trình C++. Một trong những vấn đề thực tế (mà không đi vào chi tiết quá nhiều) muốn tôi xác định một hàm có thể được truyền ifstream hoặc cin (ví dụ: istream) làm đối số. Từ đó, tôi phải đọc qua dòng. Rắc rối là, tôi không thể tìm ra cách để có một số điện thoại sử dụng chức năng này và ifstream để tìm hiệu quả kết thúc luồng. Cụ thể,Tìm kết thúc luồng cho cin & ifstream?

while(input_stream.peek() != EOF) 

sẽ không hoạt động đối với cin. Tôi có thể rework chức năng để tìm một cụm từ nhất định (như "#End of Stream #" hoặc một cái gì đó), nhưng tôi nghĩ rằng đây là một ý tưởng tồi nếu dòng tập tin tôi vượt qua có cụm từ chính xác này.

Tôi đã nghĩ sử dụng chức năng quá tải, nhưng cho đến nay cuốn sách đã đề cập đến khi nó muốn tôi làm điều này. Tôi có lẽ đang nỗ lực quá nhiều vào vấn đề thực hành này, nhưng tôi thích quá trình sáng tạo và tò mò nếu có một cách để làm điều này mà không quá tải.

+0

Kiểm tra câu hỏi này: http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input -stream-stdin – Archie

Trả lời

4

eof()làm làm việc cho cin. Bạn đang làm điều gì đó sai; xin vui lòng gửi mã của bạn. Một trở ngại phổ biến là cờ eof được đặt sau bạn cố gắng đọc sau phần cuối luồng.

Dưới đây là một minh chứng:

#include <iostream> 
#include <string> 

int main(int, char*[]) 
{ 
    std::string s; 
    for (unsigned n = 0; n < 5; ++n) 
    { 
     bool before = std::cin.eof(); 
     std::cin >> s; 
     bool after = std::cin.eof(); 
     std::cout << int(before) << " " << int(after) << " " << s << std::endl; 
    } 

    return 0; 
} 

và sản lượng của nó:

D:>t 
aaaaa 
0 0 aaaaa 
bbbbb 
0 0 bbbbb 
^Z 
0 1 bbbbb 
1 1 bbbbb 
1 1 bbbbb 

(EOF có thể được tạo ra bằng cách bấm Ctrl-Z trên Windows và Ctrl-D trên nhiều hệ điều hành khác)

+0

Xin lỗi vì sự nhầm lẫn, ban đầu tôi đã có (! Input_stream.eof()) nhưng sau đó nhận ra tôi đã viết trong khi (input_stream.peek! = EOF) thay thế. Bất kể, cả hai phương pháp đều làm việc với control + z (trớ trêu thay là tôi chỉ đọc về nhân vật eof trong wikipedia). Cảm ơn sự giúp đỡ của atzz, và tất cả mọi người! – user435219

+0

Ưu tiên chuyển luồng thành boolean trên '.eof' hoặc' .bad'. –

2

Tại sao không std::cin.eof() hoạt động? cin sẽ báo hiệu EOF khi stdin đóng, sẽ xảy ra khi người dùng báo hiệu bằng Ctrl + d (* nix) hoặc Ctrl + z (Windows) hoặc (trong trường hợp luồng đầu vào đường ống) khi đường ống tệp kết thúc

+1

Trong Windows, nó là 'Ctrl + Z',' Ctrl + D' là dành cho các hệ thống dựa trên UNIX. – Archie

+0

@Archie Oh, điểm tốt; thêm rằng trong –

+0

Ah, điều đó thực sự làm việc (cũng Ctrl + Z cho các cửa sổ anyway). Xin lỗi, nếu có một chút nhầm lẫn như tôi ban đầu đã có trong khi (! Input_stream.eof()) trong bài viết trước và chỉnh sửa nó trong khi (input_stream.peek()! = EOF). Ở mức nào, 1 mối quan tâm tôi có về việc sử dụng while (! Input_stream.eof()) là khi hàm đọc ký tự EOF, bit lỗi được đặt cho input_stream. Đây có phải là vụ xảy ra? – user435219

3

Nếu bạn sử dụng một luồng trong một bối cảnh boolean thì nó sẽ tự chuyển đổi thành một giá trị tương đương với true nếu nó không đạt tới EOF và false nếu một nỗ lực đã được thực hiện để đọc qua EOF (không phải nó cũng sai nếu có lỗi trước đó đọc từ luồng).

Vì hầu hết các hoạt động IO trên luồng đều trả về luồng (vì vậy chúng có thể bị xích). Bạn có thể thực hiện thao tác đọc và sử dụng kết quả trong bài kiểm tra (như trên).

Vì vậy, một chương trình để đọc một dòng số từ một dòng:

int main() 
{ 
    int x; 

    // Here we try and read a number from the stream. 
    // If this fails (because of EOF or other error) an internal flag is set. 
    // The stream is returned as the result of operator>> 
    // So the stream is then being used in the boolean context of the while() 
    // So it will be converted to true if operator>> worked correctly. 
    //       or false if operator>> failed because of EOF 
    while(std::cin >> x) 
    { 
     // The loop is only entered if operator>> worked correctly. 
     std::cout << "Value: " << x << "\n"; 
    } 

    // Exit when EOF (or other error). 
} 
Các vấn đề liên quan