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

Đề tài: Lập trình C++ | Thao tác stream input với C++

  1. #1
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Lập trình C++ | Thao tác stream input với C++

    Chúng ta khi làm việc với input, sẽ có những lúc ta sẽ gặp phải lỗi chẳng hạn như cin mix với cin.getline và tạo ra những hiện tượng kì quặc làm mất 1 line, hay chẳng hạn khi ta prompt user nhập vào 1 số mà họ lại vô tình nhập vào 1 kí tự, để giải quyết vấn đề phiền phức này chúng ta sẽ thao tác lại stream input bằng vài thủ thuật đơn giản sau.

    Hàm chính mà chúng ta cần thao tác lại stream input là hàm sau đây :
    PHP Code:
    bool sscin(std::istreamiss&strchar _del
    Với các tham số :
    - iss mang ý nghĩa là stream input từ user.
    - str là 1 chuỗi, hay 1 số hay 1 char...
    - _del chính là kí tự kết thúc. ( delimiter )

    C++ Code:
    1. #include <iostream>
    2. #include <ios>
    3. #include <string>
    4. #include <limits>
    5.  
    6. namespace srr
    7. {
    8.     template<class T>
    9.     bool sscin(std::istream &iss, T &str, char _del)
    10.     {
    11.         if (iss >> std::noskipws >> str >> std::skipws && (iss.eof() || iss.get() == _del))
    12.             return true;
    13.         str = T(); //Khởi tạo lại dữ liệu
    14.         iss.clear(); //trả stream về goodbit
    15.         /*Ignore tất cả kí tự còn lại trên bộ đếm*/
    16.         iss.ignore(std::numeric_limits<std::streamsize>::max(), _del);
    17.         return false;
    18.     }
    19.  
    20.     template<class T>
    21.     bool sscin(std::istream &iss, T &str)
    22.     {
    23.         return sscin(iss, str, '\n');
    24.     }
    25.  
    26.     template<>
    27.     bool sscin<std::string>(std::istream &iss, std::string &str, char _del)
    28.     {
    29.         if (std::getline(iss, str, _del))
    30.             return true;
    31.             str.erase(); //Đối với string thì ta chỉ cần xóa chuỗi là được
    32.             iss.clear();  //Trả bộ đếm về trạng thái good
    33.         return false;
    34.     }
    35.  
    36.     template<>
    37.     bool sscin<std::string>(std::istream& iss, std::string &x)
    38.     {
    39.         return sscin(iss, x, '\n');
    40.     }
    41.  
    42.     template<class T>
    43.     void format_error(std::istream& iss, T &str, char _del)
    44.     {
    45.         if (!sscin(is, str, _del))
    46.             throw std::ios_base::failure("Invalid input");
    47.     }
    48.  
    49.     template<class T>
    50.     void format_error(std::istream& iss, T &str)
    51.     {
    52.         if (!sscin(is, x, '\n'))
    53.             throw std::ios_base::failure("Invalid Input");
    54.     }
    55. }

    Và sau đây là 1 driver thử đơn giản :
    C++ Code:
    1. int main()
    2. {
    3.     int int_number;
    4.     std::cout << "Enter an integer : ";
    5.     while(!srr::sscin(std::cin, int_number))
    6.     {
    7.         std::cout << "Invalid, try again : ";
    8.     }
    9.     std::cout << "-> " << int_number << '\n';
    10.  
    11.     std::string str;
    12.     std::cout << "Enter a string : ";
    13.     srr::sscin(std::cin, str);
    14.     std::cout << "-> : " << str << '\n';
    15.  
    16.     std::cin.get();
    17. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 03:01 AM.

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Một cách đơn giản hơn dành cho những bạn mới học, ở đây kiểu là double, ta có thể tùy sữa theo mục đích sử dụng T_T :
    C++ Code:
    1. #include <iostream>
    2. #include <istream>
    3. #include <ostream>
    4. #include <limits>
    5.  
    6. int main()
    7. {
    8.     while(true){
    9.         std::cout << "Enter a number  :";
    10.         double x;
    11.         std::cin >> x;
    12.         if(std::cin.eof() || std::cin.bad())
    13.             break;
    14.         else if(std::cin.fail()){
    15.             std::cin.clear();
    16.             std::cin.ignore(std::numeric_limits<int>::max(), '\n');
    17.             continue;
    18.         }
    19.     std::cout << "square root of (" << x << ")= " << std::sqrt(x) << '\n';
    20.     }
    21. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 03:02 AM.

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Thử hỏi rox_rook, throw exception nếu không có ai và code nào bắt thì hậu quả ra sao ?
    Hồi xưa, tui tranh cãi "tóe lữa" về vụ quăng exception này. Sau đọc và nghiên cứu source code của Windows, vứt luôn cái vụ exception này.
    Nói thật là tới giờ này tui vẫn mù mờ, thấy chưa rõ về cơ chế throw và catch exception trong C++, SEH trong Windows và cơ chế dispatch exception trong kernel của Windows. Nghe mấy cha guru về RCE của nước ngoài nói, tức không chịu nỗi, vì mình có hơn tụi nó được đâu mà đòi bắt bẽ tụi nó.
    Đã được chỉnh sửa lần cuối bởi TQN : 01-02-2008 lúc 07:03 PM.

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

    Sau đọc và nghiên cứu source code của Windows
    tqn có cả source code của Windows cơ à T.T
    Thằng Windows xem như sập tiệm rồi, sắp có 1 hdh của người Việt T.T

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Trích dẫn Nguyên bản được gửi bởi huynguyen Xem bài viết
    tqn có cả source code của Windows cơ à T.T
    Thằng Windows xem như sập tiệm rồi, sắp có 1 hdh của người Việt T.T
    Windows 98 trở về trước nghe nói là MS đã public rồi. Chỉ có cái WindowsNT là giữ lại và phát triển cho đến nay đó. Thay vì cái tên NT, VersionNo thì MS đặt cái tên khác là 2000, XP, 2003 cho dễ tiêu thụ đó. Chỉ tiếc là Dr không thấy đâu cả. Thấy thì cũng xem thử xem sao.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Lập trình C++ | Thao tác stream input với C++

    Theo như vụ tranh cãi bên hva thì việc anh TQN có source của Windows là sự thật, hình như là source của Win2000
    Keep moving forward!

    ... Retired ...

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Thử hỏi rox_rook, throw exception nếu không có ai và code nào bắt thì hậu quả ra sao ?
    hì hì, tại em cũng đang học, nên đưa vào cho vui thôi T_T. Em hiểu nếu code có throw mà ko catch sẽ làm giảm performance ! T_T thanks anh đã nhắc nhớ.

  8. #8
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Đâu phải giảm performance đâu R2, là crash chương trình luôn á.
    Keep moving forward!

    ... Retired ...

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Đâu phải giảm performance đâu R2, là crash chương trình luôn á.
    Hic hic, thế à , thanks nhc nhé, phải coi kĩ lại về vụ này mới được T_T.

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Post nhầm T_T.
    PHP Code:
    #include <iostream>
    #include <istream>
    #include <ostream>
    #include <limits>

    int main()
    {
        while(
    true){
            
    std::cout << "Enter a number  : ";
            
    float x;
            
    std::cin >> x;
            if(
    std::cin.eof() && std::cin.get() == '\n')
            {
                if(
    0){
                    
    std::cout << "Positive is a must.!\n";
                    continue;
                }
                else{
                    
    std::cout << x;
                    break;
                }
            }
            else if(
    std::cin.fail()){
                
    std::cout << "Invalid Input, try again!\n";
                
    std::cin.clear();
                
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');
                continue;
            }
            else if(
    std::cin.get() != '\n')
            {
                
    std::cout << "Trailing zeros.\n";
                continue;
            }
        }


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

  1. 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
  2. Kỹ thuật C++ Thắc mắc về kiểu dữ liệu input của fstream
    Gửi bởi kukopuka 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: 26-12-2010, 05:48 PM
  3. run *.exe với file input và output như thế nào
    Gửi bởi vrael88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 07-10-2010, 12:55 PM
  4. cách save file từ Stream như thế nào? Xin giúp đỡ!
    Gửi bởi baotran trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 12-08-2010, 12:51 PM
  5. Làm thế nào để nhiều stream cùng đọc một file văn bản
    Gửi bởi tienlbhoc trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 26-10-2007, 08:49 AM

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