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

Đề tài: [Thắc mắc] cin.ignore(INT_MAX); có phải là flush toàn bộ cin buffer.

  1. #1
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Mặc định [Thắc mắc] cin.ignore(INT_MAX); có phải là flush toàn bộ cin buffer.

    Trc vẫn quen với nhập xuất trong C, các hàm nhập xuất có giá trị trả về nào đó ==> kiểm soát được input rất tốt. Hàm nhập scanf theo format ( có thể đưa biểu thức chính quy làm format), sprintf ghi ra chuỗi theo format vô cùng tiện lợi.

    Có thằng bạn nhờ code hộ bài bắt dùng nhập xuất trong C++.
    Có 1 số vấn đề sau, ai co kinh nghiệm giải thích giùm với !!
    Do code dài phải nhập input ( xâu, số, chữ cái ,..) rất nhiều lần, lặp lại...
    Nên mình muốn mỗi lần trước khi nhập thì flush cái buffer đi ( buffer của cin), muc định loại bỏ những ký tự thừa đang nằm trên vùng đệm.
    Theo mình biết thì dùng cin.ignore(INT_MAX); tuơng đuơng với loại bỏ tất cả các kí tự trong buffer

    Vậy mà dùng cin.ignore(INT_MAX); trước 1 lênh như cin>>number; thì lệnh này ko làm việc như mong muốn ( nhập enter mãi mà nó không kết thúc nhập)

    Tuơng tự khi cin.ignore(INT_MAX); xong gọi lệnh cin.getline(,,,) thì nó cũng ko làm việc như mong muốn.

    Ko hiểu cin.ignore(INT_MAX); đó đùng là flush toàn bộ buffer ko ???
    Ai có kinh nghiệm thì chỉ mình cách làm sao tránh các hiệu ứng lề, trôi ký tự,.... khi làm việc với chuơng trình nhập xuất nhiều ( số, kí tự, xâu) trong C++...???

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

    Lại phải post cái link này: http://www.daniweb.com/software-deve...-input-stream#

  3. #3
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Hỏi bác chút !!
    cin.ignore(num,delimiter) sẽ đọc trên buffer loại bỏ đủ num ký tự hoặc gặp delimiter thì dừng ( ko loại bỏ delimiter)

    Có đoan code sau:
    cin>>number;
    cin.ignore(1);==>OK
    // cin.ignore(INT_MAX) ==> ko đc, nhấn enter mãi ko dừng đc.

    VD sau khi nhập number 23Enter, '\n' còn trên buffer.
    cin.ignore(1); hay cin.ignore(INT_MAX); cũng như nhau cả.
    Đều là loại bỏ '\n' ( cái cin.ignore(INT_MAX); sau khi loại bỏ '\n' thì gặp EOF nó cũng sẽ dừng)
    Thế mà ko hiểu tại sao nó cứ ko dừng bắt nhâp mãi...

    Bác giải thích giùm chút !!!
    ( Chỉ sợ em đang hiểu sai công dùng hàm ignore)

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

    Chưa thêm delimiter kìa. Mặc định là delim=eof chứ đâu phải '\n'.

  5. #5
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Chưa thêm delimiter kìa. Mặc định là delim=eof chứ đâu phải '\n'.
    Theo mình hiểu thì ignore nó sẽ ko loại bỏ delimiter ( khi đọc đến nó) khỏi buffer.
    Ở kia sau khi nhập cin>>number; còn '\n' trên buffer thì mình đang muốn loại bỏ nó.
    Dùng ignore(1); OK, dùng ignore(số >1) ==> ko như ý muốn.
    Mà theo ý hiểu thì 2 cái đó lẽ ra phải làm việc như nhau ( vì hiện tại buffer chỉ có '\n')

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

    Mặc định [Thắc mắc] cin.ignore(INT_MAX); có phải là flush toàn bộ cin buffer.

    std::basic_istream::basic_istream& ignore( std::streamsize count = 1, int_type delim = Traits::eof() );

    Extracts and discards characters from the input stream until and including delim.

    Behaves as UnformattedInputFunction. After constructing and checking the sentry object, extracts characters from the stream and discards them until any one of the following conditions occurs:

    count characters were extracted (this test is disabled in the special case when count equals std::numeric_limits<std::streamsize>::max()

    end of file conditions occurs in the input sequence (in which case the function calls setstate(eofbit)

    the next available character c in the input sequence is delim as determined by Traits::eq_int_type(Traits::to_int_type(c), delim). The delimiter character is extracted and discarded (this test is disabled if delim is Traits::eof())

    Parameters
    count - number of characters to extract
    delim - delimiting character to stop the extraction at. It is also extracted.
    Return value

    *this
    Như vậy, câu lệnh:
    C++ Code:
    1. cin.ignore(2)
    tương ưng với việc lấy từ buffer và bỏ qua nó cho đến khi:
    - Hết 2 ký tự,
    - Kết thúc file
    Vì trong buffer đã có 1 kí tự '\n' nên nó sẽ đợi cho đến khi nhập 1 ký tự nữa rồi mới kết thúc ignore().

    Xem vì dụ ở đây: http://ideone.com/gGrZDU. Ta thấy kí tự 'a' đã bị bỏ qua.

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

  1. Làm sạch buffer khi nhập dữ liệu như thế nào?
    Gửi bởi Nu Sinh Khong Danh Nhau trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 33
    Bài viết cuối: 19-09-2012, 07:28 PM
  2. Kỹ thuật C luồng(stream) và buffer(bộ đệm) khác nhau như thế nào???
    Gửi bởi SolitaryWolf trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 16-09-2012, 09:05 PM
  3. Graphic Ghi Bitmap vào buffer và đọc từ buffer trong C#?
    Gửi bởi bladevn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 01-03-2012, 02:02 PM
  4. lệnh cin.ignore() trong C++ có tác dụng như thế nào?
    Gửi bởi flash100001 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 05-04-2011, 04:11 PM
  5. flush buffer của socket trong lập trình VC++?
    Gửi bởi rua_con trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 08-11-2010, 09:33 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