当前位置:   article > 正文

C语言实现进度条_c typedef void (*progressbarset)();

c typedef void (*progressbarset)();

progressBar.hpp:

  1. #ifndef __PROGRESSBAR_HPP
  2. #define __PROGRESSBAR_HPP
  3. #include <iostream>
  4. #include <stdexcept>
  5. #include <string>
  6. // the following are UBUNTU/LINUX ONLY terminal color codes.
  7. #define RESET "\033[0m"
  8. #define BLACK "\033[30m" /* Black */
  9. #define RED "\033[31m" /* Red */
  10. #define GREEN "\033[32m" /* Green */
  11. #define YELLOW "\033[33m" /* Yellow */
  12. #define BLUE "\033[34m" /* Blue */
  13. #define MAGENTA "\033[35m" /* Magenta */
  14. #define CYAN "\033[36m" /* Cyan */
  15. #define WHITE "\033[37m" /* White */
  16. #define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
  17. #define BOLDRED "\033[1m\033[31m" /* Bold Red */
  18. #define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
  19. #define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
  20. #define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
  21. #define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
  22. #define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
  23. #define BOLDWHITE "\033[1m\033[37m" /* Bold White */
  24. class progressbar {
  25. public:
  26. // default destructor
  27. ~progressbar() = default;
  28. // delete everything else
  29. progressbar(progressbar const&) = delete;
  30. progressbar& operator=(progressbar const&) = delete;
  31. progressbar(progressbar&&) = delete;
  32. progressbar& operator=(progressbar&&) = delete;
  33. // default constructor, must call set_niter later
  34. progressbar();
  35. progressbar(const std::string& type, int n, bool showbar = true);
  36. // reset bar to use it again
  37. void reset();
  38. // set number of loop iterations
  39. void set_niter(int iter);
  40. // chose your style
  41. void set_done_char(const std::string& sym) { done_char = sym; }
  42. void set_todo_char(const std::string& sym) { todo_char = sym; }
  43. void set_opening_bracket_char(const std::string& sym) { opening_bracket_char = sym; }
  44. void set_closing_bracket_char(const std::string& sym) { closing_bracket_char = sym; }
  45. // to show only the percentage
  46. void show_bar(bool flag = true) { do_show_bar = flag; }
  47. // main function
  48. void update();
  49. void update(int n);
  50. // default style
  51. void setDefaultStyle();
  52. private:
  53. std::string m_type;
  54. int progress;
  55. int n_cycles;
  56. int last_perc;
  57. bool do_show_bar;
  58. bool update_is_called;
  59. std::string done_char;
  60. std::string todo_char;
  61. std::string opening_bracket_char;
  62. std::string closing_bracket_char;
  63. };
  64. progressbar::progressbar()
  65. : progress(0),
  66. m_type(GREEN),
  67. n_cycles(0),
  68. last_perc(0),
  69. do_show_bar(true),
  70. update_is_called(false),
  71. done_char("#"),
  72. todo_char(" "),
  73. opening_bracket_char("["),
  74. closing_bracket_char("]") {}
  75. progressbar::progressbar(const std::string& type, int n, bool showbar)
  76. : progress(0),
  77. m_type(type),
  78. n_cycles(n),
  79. last_perc(0),
  80. do_show_bar(showbar),
  81. update_is_called(false),
  82. done_char("#"),
  83. todo_char(" "),
  84. opening_bracket_char("["),
  85. closing_bracket_char("]") {}
  86. void progressbar::reset() {
  87. progress = 0, update_is_called = false;
  88. last_perc = 0;
  89. return;
  90. }
  91. void progressbar::set_niter(int niter) {
  92. if (niter <= 0)
  93. throw std::invalid_argument("progressbar::set_niter: number of iterations null or negative");
  94. n_cycles = niter;
  95. return;
  96. }
  97. void progressbar::update() {
  98. if (n_cycles == 0)
  99. throw std::runtime_error("progressbar::update: number of cycles not set");
  100. if (!update_is_called) {
  101. if (do_show_bar == true) {
  102. std::cout << m_type << ":" << opening_bracket_char;
  103. for (int _ = 0; _ < 50; _++)
  104. std::cout << todo_char;
  105. std::cout << closing_bracket_char << " 0%";
  106. } else
  107. std::cout << "0%";
  108. }
  109. update_is_called = true;
  110. // compute percentage, if did not change, do nothing and return
  111. int perc = progress * 100. / (n_cycles - 1);
  112. if (perc < last_perc)
  113. return;
  114. // update percentage each unit
  115. if (perc == last_perc + 1) {
  116. // erase the correct number of characters
  117. if (perc <= 10)
  118. std::cout << "\b\b" << perc << '%';
  119. else if (perc > 10 and perc < 100)
  120. std::cout << "\b\b\b" << perc << '%';
  121. else if (perc == 100)
  122. std::cout << "\b\b\b" << perc << '%';
  123. }
  124. if (do_show_bar == true) {
  125. // update bar every ten units
  126. if (perc % 2 == 0) {
  127. // erase closing bracket
  128. std::cout << std::string(closing_bracket_char.size(), '\b');
  129. // erase trailing percentage characters
  130. if (perc < 10)
  131. std::cout << "\b\b\b";
  132. else if (perc >= 10 && perc < 100)
  133. std::cout << "\b\b\b\b";
  134. else if (perc == 100)
  135. std::cout << "\b\b\b\b\b";
  136. // erase 'todo_char'
  137. for (int j = 0; j < 50 - (perc - 1) / 2; ++j) {
  138. std::cout << std::string(todo_char.size(), '\b');
  139. }
  140. // add one additional 'done_char'
  141. if (perc == 0)
  142. std::cout << todo_char;
  143. else
  144. std::cout << done_char;
  145. // refill with 'todo_char'
  146. for (int j = 0; j < 50 - (perc - 1) / 2 - 1; ++j)
  147. std::cout << todo_char;
  148. // readd trailing percentage characters
  149. std::cout << closing_bracket_char << ' ' << perc << '%';
  150. if (perc == 100)
  151. std::cout << std::endl;
  152. }
  153. }
  154. last_perc = perc;
  155. ++progress;
  156. std::cout << std::flush;
  157. return;
  158. }
  159. void progressbar::update(int n) {
  160. for (int i = 0; i < n; i++) {
  161. update();
  162. }
  163. }
  164. void progressbar::setDefaultStyle() {
  165. set_todo_char(" ");
  166. set_done_char("*");
  167. set_opening_bracket_char("[");
  168. set_closing_bracket_char("]");
  169. }
  170. #endif

 测试代码test.cpp:

  1. #include <unistd.h>
  2. #include "progressbar.hpp"
  3. int main(int argc, char* argv[]) {
  4. progressbar bar;
  5. bar.set_niter(60);
  6. bar.setDefaultStyle();
  7. for (size_t i = 0; i < 60; i++) {
  8. // if ((i % 20) == 0) {
  9. // bar.reset();
  10. // }
  11. bar.update();
  12. sleep(1);
  13. }
  14. return 0;
  15. }

编译:g++ ./test.cpp -o main, 运行./main, 结果输出:

 

还有点小问题是:输出*不连续,暂时未发现问题在哪里,待修改。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/264271
推荐阅读
  

闽ICP备14008679号