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

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

  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 với input trong C++ (Advance)

    Nói về lớp I/O trong C++ thì phải nói là quá đỉnh rùi, nhưng 1 đặc tính nổi trội của C++ nữa là template metaprogram, reuse-reuse and generic-programming. Và đoạn code dưới đây là của 1 cao thủ C++ mà mình chôm được, nhưng thấy nó hay quá T_T nên đem về chia sẽ cho mọi người. Nếu các bạn đã từng mệt mỏi với cin, cin.getline, getline(cin, ). Khi user khai báo int var; mà người dùng lại vô tình nhập 1 kí tự hay chuỗi, thì đây a treat for you . If you are fan of C++, you should enjoy it
    C++ Code:
    1. //
    2. // basic_input.h
    3. //
    4. // Contains the declaration/definition of console input helper functions
    5. // that make basic console input easier for new C++ programmers.
    6. //
    7. // basic_input:
    8. //    template<typename charT, typename traits, typename T>
    9. //      inline bool basic_input(std::basic_istream<charT,traits>& is, T& x, charT delim)
    10. //    template<typename charT, typename traits, typename Allocator>
    11. //      inline bool basic_input(std::basic_istream<charT,traits>& is, std::basic_string<charT,traits,Allocator>& x, charT delim)
    12. //    template<typename charT, typename traits>
    13. //      inline bool basic_input(std::basic_istream<charT,traits>& is, charT* x, std::streamsize count, charT delim)
    14. //    template<typename charT, typename traits, typename T>
    15. //      inline bool basic_input(std::basic_istream<charT,traits>& is, T& x)
    16. //
    17. //  Returns:
    18. //    bool - true if the input succeeded, false otherwise.
    19. //
    20. //  Effects:
    21. //    This function attempts to read from the input stream into the passed in
    22. //    variable up to the specified delimiter. If the data in the stream does
    23. //    not match the expected format of the variable type, or if the character
    24. //    following the data read in is not the delimiter, then the input fails.
    25. //
    26. //    On success, the variable x contains the inputted value. On failure, the
    27. //    variable x is cleared (i.e. default-initialized).
    28. //
    29. //    On success or failure, the input stream is left in a good state and all
    30. //    characters up to and including the delimiter are removed from the stream.
    31. //
    32. //    The delimiter defaults to '\n' if not specified.
    33. //
    34. //    If the variable type is char* (or some other character pointer), and the
    35. //    delimiter has not yet been reached prior to count characters being read
    36. //    in, then the input has failed and the array pointed to by the char* will
    37. //    be filled with count characters set to null.
    38. //
    39. //  Sample usage:
    40. //    int i;
    41. //    std::cout << "Enter an int: ";
    42. //    while (!bip::basic_input(std::cin, i))
    43. //        std::cout << "Invalid int! Try again: ";
    44. //
    45. //
    46. // ignore_line:
    47. //    template<typename charT, typename traits>
    48. //    inline std::basic_istream<charT,traits>& ignore_line(std::basic_istream<charT,traits>& is, charT delim)
    49. //    template<typename charT, typename traits>
    50. //    inline std::basic_istream<charT,traits>& ignore_line(std::basic_istream<charT,traits>& is)
    51. //
    52. //  Returns:
    53. //    std::basic_istream<charT,traits>& - the stream passed in.
    54. //
    55. //  Effects:
    56. //    This function reads and discards all characters in the passed in input
    57. //    stream up to and including the first instance of the delimiter. The
    58. //    delimiter defaults to '\n' if not specified.
    59. //
    60. //  Sample usage:
    61. //    std::cout << "Press Enter to Close.\n";
    62. //    bip::ignore_line(std::cin);
    63. //
    64.  
    65. #ifndef BASIC_INPUT_H_
    66. #define BASIC_INPUT_H_
    67.  
    68. #include <istream>
    69. #include <ios>
    70. #include <string>
    71. #include <limits>
    72.  
    73. namespace bip
    74. {
    75.     template<typename charT, typename traits>
    76.     inline std::basic_istream<charT,traits>& ignore_line(std::basic_istream<charT,traits>& is, charT delim)
    77.     {
    78.         return is.ignore(std::numeric_limits<std::streamsize>::max(), delim);
    79.     }
    80.  
    81.     template<typename charT, typename traits>
    82.     inline std::basic_istream<charT,traits>& ignore_line(std::basic_istream<charT,traits>& is)
    83.     {
    84.         return ignore_line(is, is.widen('\n'));
    85.     }
    86.  
    87.     template<typename charT, typename traits, typename T>
    88.     inline bool basic_input(std::basic_istream<charT,traits>& is, T& x, charT delim)
    89.     {
    90.         std::ios::fmtflags old_flags = is.flags();
    91.         if ((is >> std::noskipws >> x) && (is.eof() || is.get() == delim))
    92.         {
    93.             is.flags(old_flags);
    94.             return true;
    95.         }
    96.         is.flags(old_flags);
    97.  
    98.         x = T();
    99.         is.clear();
    100.         ignore_line(is, delim);
    101.         return false;
    102.     }
    103.  
    104.     template<typename charT, typename traits, typename Allocator>
    105.     inline bool basic_input(std::basic_istream<charT,traits>& is, std::basic_string<charT,traits,Allocator>& x, charT delim)
    106.     {
    107.         if (std::getline(is, x, delim))
    108.             return true;
    109.  
    110.         x.clear();
    111.         is.clear();
    112.         return false;
    113.     }
    114.  
    115.     template<typename charT, typename traits>
    116.     inline bool basic_input(std::basic_istream<charT,traits>& is, charT* x, std::streamsize count, charT delim)
    117.     {
    118.         if (is.getline(x, count, delim))
    119.             return true;
    120.  
    121.         if (is.gcount()+1 < count)
    122.             memset(x, charT(), count);
    123.  
    124.         is.clear();
    125.         ignore_line(is, delim);
    126.         return false;
    127.     }
    128.  
    129.     template<typename charT, typename traits, typename T>
    130.     inline bool basic_input(std::basic_istream<charT,traits>& is, T& x)
    131.     {
    132.         return basic_input(is, x, is.widen('\n'));
    133.     }
    134. }
    135.  
    136. #endif  // BASIC_INPUT_H_

    Driver Example :
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include "basic_input.h"
    4.  
    5. int main()
    6. {
    7.     const std::streamsize cslen = 5;
    8.     char cstyle[cslen];
    9.     std::cout << "Enter a line of text: ";
    10.     if (bip::basic_input(std::cin, cstyle, cslen, '\n'))
    11.         std::cout << "The line of text read in was: " << cstyle << std::endl;
    12.     else
    13.         std::cout << "Sorry, invalid: " << cstyle << std::endl;
    14.  
    15.     std::string s;
    16.     std::cout << "Enter a line of text: ";
    17.     bip::basic_input(std::cin, s);
    18.     std::cout << "The line of text read in was: " << s << std::endl;
    19.  
    20.     int i;
    21.     std::cout << "Enter an int: ";
    22.     if (bip::basic_input(std::cin, i))
    23.         std::cout << "The number read in was: " << i << std::endl;
    24.     else
    25.         std::cout << "Sorry, invalid int!" << std::endl;
    26.  
    27.     double d;
    28.     std::cout << "Enter a double: ";
    29.     while (!bip::basic_input(std::cin, d))
    30.     {
    31.         std::cout << "Invalid double! Try again: ";
    32.     }
    33.     std::cout << "The double read in was: " << d << std::endl;
    34.  
    35.     std::wstring ws;
    36.     std::wcout << L"Enter a line of text: ";
    37.     bip::basic_input(std::wcin, ws);
    38.     std::wcout << L"The line of text read in was: " << ws << std::endl;
    39.  
    40.     int wi;
    41.     std::wcout << L"Enter an int: ";
    42.     if (bip::basic_input(std::wcin, wi))
    43.         std::wcout << L"The number read in was: " << wi << std::endl;
    44.     else
    45.         std::wcout << L"Sorry, invalid int!" << std::endl;
    46.  
    47.     double wd;
    48.     std::wcout << L"Enter a double: ";
    49.     while (!bip::basic_input(std::wcin, wd))
    50.     {
    51.         std::wcout << L"Invalid double! Try again: ";
    52.     }
    53.     std::wcout << L"The double read in was: " << wd << std::endl;
    54.  
    55.     std::cout << "Press Enter to Close.\n";
    56.     bip::ignore_line(std::cin);
    57. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 12-03-2008 lúc 02:44 PM.

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

  1. Algorithm làm sao để set value cho thẻ input Type = 'file' trong webbrowser.
    Gửi bởi bibi_1234 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 23-02-2017, 01:43 PM
  2. 2 Day Diet Advance - Thuốc giảm cân Linh Chi công thức mới
    Gửi bởi ngocbeautyads trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 2
    Bài viết cuối: 11-10-2012, 11:37 AM
  3. đọc 1 mảng từ file input kể cả khoản trắng trong C như thế nào?
    Gửi bởi cugaru279 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 2
    Bài viết cuối: 20-05-2012, 09:40 PM
  4. Bạn nào học khóa Web Advance Plus Tại Backhoa-SoftWare chưa?
    Gửi bởi bang651990 trong diễn đàn Giải trí - Thư giãn
    Trả lời: 0
    Bài viết cuối: 15-12-2011, 05:12 PM
  5. Bán ô tô Acura MDX Advance 2011 - Giá bán: Thỏa thuận
    Gửi bởi cotiencolien 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: 07-05-2011, 07:18 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