2012-04-13 31 views
6

Tôi muốn biết nếu và tại sao seekg(0) không được yêu cầu xóa eofbit của luồng. Tôi đang ở một điểm mà tôi đã đọc tất cả các dòng, do đó EOF đã đạt được (nhưng không có failbit được đặt) và muốn quay lại với seekg() đến vị trí hợp lệ và đọc lại một số ký tự. Trong trường hợp này, seekg(0) có vẻ "hoạt động" với tập hợp eofbit, nhưng ngay sau khi tôi cố gắng đọc từ luồng, thì failbit được đặt. Đây có phải là logic, đúng hay là việc triển khai của tôi không tốt? Tôi có nên nhận ra trường hợp này và xóa eofbit bằng tay (nếu không đặt được failbit)?Tại sao không thấy kg (0) xóa trạng thái eOF của luồng?

EDIT:

Chương trình sau đây được cung cấp bởi một độc giả cho kết quả khác nhau trong việc thực hiện của tôi (. Mingw32-C++ exe (TDM-2 mingw32) 4.4.1):

#include <sstream> 
#include <iostream> 
#include <string> 

int main() { 
     std::istringstream foo("AAA"); 
     std::string a; 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo.seekg(0); 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 
} 

Các ý kiến ​​trên là từ người dùng đã thử chương trình đó trong quá trình triển khai của mình. Tôi nhận được các kết quả này:

1 0 
1 0 
1 1 
1 1 
+0

Vâng, bạn phải tự thiết lập lại tình trạng của con suối. –

+0

@Martin: Dường như là tiêu chuẩn cũ so với vấn đề tiêu chuẩn mới. – Anonymous

Trả lời

2

Theo tiêu chuẩn mớiclear() là nghĩa vụ phải thiết lập lại eofbit (§ 27.7.2.3):

basic_istream<charT,traits>& seekg(pos_type pos);

Effects: cư xử như một chức năng đầu vào chưa định dạng ..., ngoại trừ chức năng này sẽ xóa eofbit ...

B ut trong số tiêu chuẩn (§ 27.6.1.3) không có đề cập đến việc xóa số eofbit!

Và một thử nghiệm đơn giản:

#include <sstream> 
#include <iostream> 
#include <string> 

int main() { 
     std::istringstream foo("AAA"); 
     std::string a; 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo.seekg(0); 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0 
     foo >> a; 
     std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1 
} 
+0

sau foo.seekg đầu tiên của bạn (0), eofbit bị xóa trong ví dụ của bạn, trong khi nó vẫn còn trong quá trình triển khai của tôi. Đó là lý do tại sao tôi hỏi điều gì đó kỳ lạ có thể xảy ra. Chương trình của bạn cung cấp 1 0, 1 0, 1 1, 1 1 – Martin

+0

@Martin: Điểm tốt. Trình biên dịch nào và môi trường nào? Tôi nhận được kết quả được đăng với: 'clang 3.1',' gcc 4.7.0' và 'gcc 4.6.3' (có và không có' -std = C++ 0x'). Tuy nhiên với 'VS2010' tôi nhận được kết quả tương tự như bạn. – Anonymous

+0

Một chút [cũ] tài liệu (http://support.microsoft.com/kb/146445) từ Microsoft có thể làm sáng tỏ một số vấn đề. ** Trạng thái: ** _Điều này là do thiết kế._ Và tiêu chuẩn ...? – Anonymous

0

Tại sao không chỉ rõ ràng() luồng sau đó quay trở lại khi eofbit đã được đặt? EOF đã đạt được, tại sao nên xemkg tự động xóa nó? Làm như vậy sẽ gây ra nhiều vấn đề hơn.

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