Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Kỹ thuật bắt lỗi vào ra trên C++ như thế nào?

  1. #1
    Ngày gia nhập
    04 2009
    Bài viết
    15

    Exclamation Kỹ thuật bắt lỗi vào ra trên C++ như thế nào?

    Mình đang tìm tài liệu về vấn đề: " Tìm hiểu về kỹ thuật bắt lỗi vào/ra: Các bit lỗi (error-status bits) của lớp ios, các hàm đọc và thiết lập bit lỗi ". Mọi người có tài liêu về vấn đề này thì share cho mình với ??
    Thanks !!
    Đã được chỉnh sửa lần cuối bởi yentinh : 07-05-2009 lúc 09:53 AM.

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    21

    Sơ lược là như thế này:
    CÁC TRẠNG THÁI DÒNG
    Khái niệm cờ: chứa trong một bit, có 2 trạng thái:
    Bật (on) có giá trị 1
    Tắt (off) có giá trị 0


    Mỗi stream lưu giữ những cờ trạng thái cho ta biết thao tác nhập, xuất có thành công hay không, và nguyên nhân gây lỗi. Các cờ này, cũng như cờ định dạng, thực chất là các phần tử của 1 vector bit ( 1 số nguyên ). Chúng bao gồm.
    · goodbit: bật khi không có lỗi xảy ra và các cờ khác đều tắt.
    · eofbit: bật khi gặp end-of-file.
    · failbit: bật khi việc nhập trở nên không chính xác nhưng stream vẫn ổn. Ví dụ như thay vì nhập số nguyên thì người dùng lại nhập ký tự.
    · badbit: bật khi bằng cách nào đó stream bị hỏng và mất dữ liệu.
    Các cờ trên có thể được truy xuất thông qua các hàm tương ứng: good(), eof(), fail() và bad()
    Bạn có thể lấy toàn bộ các cờ bằng hàm ios::iostate rdstate();
    Xem ví dụ bên dưới:
    int x;
    cout << "Enter an integer: ";
    cin >> x;
    // The state of the stream can be gotten with rdstate.
    ios::iostate flags = cin.rdstate();
    // We can test for which bits are set as follows.
    // Note the use of the bitwise & operator.
    // It's usually easier to test the bits directly:
    if (flags & ios::failbit)
    cout << "failbit set." << endl;
    else cout << "failbit not set." << endl;
    if (flags & ios::badbit)
    cout << "badbit set." << endl;
    else cout << "badbit not set." << endl;
    if (flags & ios::eofbit)
    cout << "eofbit set." << endl;
    else cout << "eofbit not set." << endl;
    if (cin.good())
    cout << "Stream state is good." << endl;
    else cout << "Stream state is not good." << endl;
    if (cin.fail())
    cout << "Are you sure you entered an integer?" << endl;
    else cout << "You entered: " << x << endl;
    Bạn có thể đặt lại các cờ trạng thái bằng phương thức clear():
    void clear(ios::iostate flags = ios::goodbit );
    Phương thức này sẽ reset toàn bộ các bit về 0 và bật cờ flags.
    VD: cin.clear() sẽ đưa trạng thái dòng về OK, cin.clear(ios::failbit) sẽ bật failbit ( xóa những cái khác ) còn cin.clear( ios::failbit | ios::badbit) sẽ bật failbit và badbit.
    Để bật 1 cờ mà không làm ảnh hưởng đến cờ khác, ta dùng toán tử | với chính vector bit:
    cin.clear( ios::badbit | cin.rdstate());
    Hoặc hàm setstate:
    void setstate( ios::iostate states)
    Ví dụ:
    cin.setstate( ios::failbit | ios::badbit)
    Đã được chỉnh sửa lần cuối bởi regist : 08-05-2009 lúc 10:17 AM.

  3. #3
    Ngày gia nhập
    04 2009
    Bài viết
    15

    cho mình hỏi thêm là: Các bit lỗi (error-status bits) của lớp ios -> Chỉ ra nhưng bit lỗi dạng như nào nhỉ ?

  4. #4
    Ngày gia nhập
    11 2008
    Bài viết
    21

    Bạn hỏi rõ hơn được không, thực ra trong sách mình đọc nó cũng chỉ viết thế này thôi !

  5. #5
    Ngày gia nhập
    04 2009
    Bài viết
    15

    Trích dẫn Nguyên bản được gửi bởi yentinh Xem bài viết
    cho mình hỏi thêm là: Các bit lỗi (error-status bits) của lớp ios -> Chỉ ra nhưng bit lỗi dạng như nào nhỉ ?
    Mình đọc trong sách:
    " Các bit trạng thái lỗi là một số enum ios báo cáo các lỗi xảy ra trong một hoạt động vào hoặc ra". Mình muốn hỏi cái số enumios nghĩa là gì ?
    Và bạn có thể nói rõ hơn về các hàm đọc và thiết lập bit lỗi ?
    Mình chưa rõ lắm, thanks !

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    21

    Mặc định Kỹ thuật bắt lỗi vào ra trên C++ như thế nào?

    Từ khóa enum trong C thì bạn biết rồi, nó là 1 tập các bí danh cho các giá trị nguyên
    C++ Code:
    1. enum iostate { goodbit=0, failbit=1, eofbit=2, badbit=4 };
    ở dạng nhị phân goodbit là 0000, eofbit là 0001, failbit là 0010, badbit là 0100

    Mình không tìm hiểu kĩ về phần này nên mình cũng không chắc, theo như mình hiểu thì mỗi cờ là 1 bit trong 1 số nguyên, lớp ios sẽ quy định cờ nào là bit thứ mấy.

    Tổng hợp của các cờ trạng thái là 1 chuỗi nhị phân ví dụ 0110

    Để đọc chuỗi này ta dùng kĩ thuật mặt nạ (masking)
    Ví dụ để đọc xem có gặp phải eof không thì ta đọc bit thứ 1 tính từ cuối của chuỗi bằng mặt nạ eofbit:
    0110 & 0001 => 0000 tức là 0, vậy cờ eof đang tắt
    Kiểm tra cờ failbit thì ta đọc bit thứ 2 tính từ cuối bằng mặt nạ failbit:
    0110 & 0010 => 0010 khác 0 => đang bật.
    ...
    Với cách hiểu này thì các hàm đọc bit sẽ như sau:

    C++ Code:
    1. bool ios::good()
    2. {
    3.     return !( goodbit & rdstate() );
    4. }
    5. bool ios::bad()
    6. {
    7.     return badbit & rdstate();
    8. }
    9. bool ios::eof()
    10. {
    11.     return eofbit & rdstate();
    12. }
    13. bool ios::fail()
    14. {
    15.     return failbit & rdstate();
    16. }

    Bạn có thể search trên google bằng từ khóa error state bits để kiểm tra lại những cái trên hộ mình được không
    Đã được chỉnh sửa lần cuối bởi regist : 08-05-2009 lúc 11:15 AM.

  7. #7
    Ngày gia nhập
    04 2009
    Bài viết
    15

    Bạn có thể chỉ ra những ví dụ rõ ràng hơn bằng chương trình với các hàm good(), eof(), bad(),...??
    Thanks!

Các đề tài tương tự

  1. CNN nhận dịch thuật hơn 50 ngôn ngữ trên thế giới
    Gửi bởi ngocbichtb89 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 27-07-2012, 07:34 AM
  2. Thuật toán tìm bao đóng của tập thuộc tính. Cách cài đặt trên C++ thế nào?
    Gửi bởi lamlx trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 27-11-2010, 09:48 AM
  3. Xây dựng thuật toán Quicksort trên C# như thế nào?
    Gửi bởi quockhanh.K94 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 12-08-2010, 10:04 PM
  4. kỹ thuật hook trên C# là như thế nào?
    Gửi bởi 1minhdat trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 06-08-2010, 09:53 PM
  5. Thuật toán huuff man trên VC++6 như thế nào?
    Gửi bởi trantiensvbt trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 29-03-2010, 11:34 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn