我有一个控制台应用程序,我想打印进度。但是,为了使这个尽可能好,我想用回车打印百分比更新,以保持百分比更新,而不是添加具有新进度状态的新行。
使用回车打印效果很好,直到我得到一个超出控制台窗口宽度的字符串。显然,回车不会返回到比控制台窗口更长的字符串的开头。
是否有可能捕捉到这种情况,并以某种方式再次从字符串的开头开始?
可视化问题:
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 |
回车使字符串从->
开始打印,如上图所示
答案 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]
您的结果会有所不同。