C ++ Console在回车的同一行打印

时间:2017-07-20 19:14:56

标签: c++ console-application carriage-return

我有一个控制台应用程序,我想打印进度。但是,为了使这个尽可能好,我想用回车打印百分比更新,以保持百分比更新,而不是添加具有新进度状态的新行。

使用回车打印效果很好,直到我得到一个超出控制台窗口宽度的字符串。显然,回车不会返回到比控制台窗口更长的字符串的开头。

是否有可能捕捉到这种情况,并以某种方式再次从字符串的开头开始?

可视化问题:

string = "This is a test string which is longer than the console";
  |<-      Console width       ->|
  |This is a test string which is|
->| longer than the console      |

回车使字符串从->开始打印,如上图所示

3 个答案:

答案 0 :(得分:2)

问题是控制台窗口不同。在Windows平台上,您可以调整控制台的宽度和高度。

您可以找到一些返回控制台窗口高度和宽度的API;但是没有要求平台支持这一点。

有些库可以帮助定位光标。搜索软件建议(在StackExchange上)以查看他们推荐的内容或在互联网上搜索“c ++光标位置库”。

答案 1 :(得分:0)

在Linux上,你在找这样的东西吗?

#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
    struct winsize size;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);

    printf ("%d\n", size.ws_row);
    printf ("%d\n", size.ws_col);
}

答案 2 :(得分:0)

  

直到我得到一个超出控制台窗口宽度的字符串。

可以用c ++创建一个小的util函数来获取ncurses报告的当前屏幕尺寸。

如果您在每次输出之前运行它,您将拥有根据字符串大小预测“环绕式”所需的维度,并采取您想要的操作。 stringstream的使用非常有用。

#include <iostream>
#include <iomanip>
#include <vector>
// I prefer to not include ncurses here, see below 


// determine current console dimensions
class ConsoleDimensions
{
public:
   ConsoleDimensions()  = default;
   ~ConsoleDimensions() = default;
   //
   std::string operator()();
};


class T504_t // or any class name you want
{
public:

   T504_t() = default;
   ~T504_t() = default;

   int exec()
      {
         std::cout << "\n\n" << ConsoleDimensions()() << std::endl;
         //                    invokes operator()--^^
         return(0);
      }

}; // class T504_t



int main(int argc, char* argv[])
{
  std::cout << "\nargc: " << argc << std::endl;
  for (int i = 0; i < argc; i += 1) std::cout << argv[i] << " ";
  std::cout << std::endl;

   int retVal = -1;
   {
      T504_t   t504;
      retVal = t504.exec();
   }

   std::cout << "\n\n  <<< If your C++ 'Hello World' has no class ... "
             <<" why bother? >>> \n\n"
             << std::endl;
   return(retVal);
}



// separate this implementation file (.cc)
//     to prevent the curses macros from polluting your non-curses code
#include "cursesw.h"

std::string ConsoleDimensions::operator()()
      {
         (void)initscr(); // start curses mode
         cbreak();
         noecho();
         // erase()
         // refresh()
         raw();
         // nonl();
         // intrFlush(stdscr, FALSE)
         keypad(stdscr, true);

         // curses uses int (will there ever be a negative height or width?)
         int curses_reported_height = 0;
         int curses_reported_width  = 0;
         getmaxyx(stdscr, curses_reported_height, curses_reported_width);

         std::stringstream ss;
         ss << "  max y: " << curses_reported_height
            << "  max x: " << curses_reported_width;

         endwin();
         return(ss.str());
      }

在具有默认字体的全屏标准gnome-terminal上运行此输出时的输出:

  max y: 70  max x: 266

您可能只想要数字,而不是文本。它很容易改变

std::string ConsoleDimensions::operator()();

我会考虑,

void ConsoleDimensions::operator()(int& maxY, int& maxX);

进行适当的实施更改。

更新2017-07-22

使用std :: chrono :: high_resolution_clock进行性能估算并形成“void ConsoleDimensions :: operator()(int&amp; maxY,int ^ maxX);”

171.2830000 k ConsoleDimension()(int&, int&) events in 4,000,006 us
42.82068577 k ConsoleDimension()(int&, int&) events per second
23.35319909 µ sec per  ConsoleDimension()(int&, int&) event 

dimensions [50,100]

您的结果会有所不同。