ncurses

时间:2017-01-26 22:40:21

标签: c++ ncurses

很抱歉,如果这是一个非常棒的问题,但我只是从ncurses(和C ++)开始。

我尝试在ncurses代码中调用系统命令(例如,任何东西都可以工作)并将输出存储在变量中,直到我打印它才会显示它,但是当我创建变量时使用system()输出,它会自动打印在屏幕上。

到目前为止,这是我的代码:

#include <iostream>
#include <string>
#include <ncurses.h>

using namespace std;

string g;

int main()
{

initscr();
int h, w;
getmaxyx(stdscr, h, w);   
cbreak();
refresh();

g=system("date");

WINDOW* w1_b = newwin(h, w/2, 0, 0);
box(w1_b, 0 , 0);
WINDOW* w2_b = newwin(h/2, w/2, 0, w/2);
box(w2_b, 0 , 0);
WINDOW* w3_b = newwin(h/2, w/2, h/2, w/2);
box(w3_b, 0 , 0);

wrefresh(w1_b);
wrefresh(w2_b);
wrefresh(w3_b);

WINDOW* w1 = newwin(h-2, (w/2)-2, 1, 1);
WINDOW* w2 = newwin((h/2)-2, (w/2)-2, 1, (w/2)+1);
WINDOW* w3 = newwin((h/2)-2, (w/2)-2, (h/2)+1, (w/2)+1);

mvwprintw(w1, 1, 1, "Window 1");
mvwprintw(w2, 1, 1, "Window 2");
mvwprintw(w3, 1, 1, "Window 3");

wrefresh(w1);
wrefresh(w2);
wrefresh(w3);

getch();

endwin(); 
return 0;       

}

现在,当执行g=system("date");时,即使我将它存储在一个变量(在这种情况下为g)中,日期也会自动打印在屏幕上,任何可能出错的想法?

3 个答案:

答案 0 :(得分:2)

popen()函数可用于执行命令并以编程方式读取其输出。

答案 1 :(得分:1)

您没有存储在变量中。 std :: system()函数返回您执行的命令的退出值,而不是命令将写入标准输出的文本(如果有)。在任何严肃的C或C ++代码中使用std :: system()是不合适的 - 我个人希望看到它在两种语言中都被弃用。

答案 2 :(得分:1)

首先,请注意您使用system的命令及其效果和输出必须依赖于系统。要获得当前日期,最好使用相关的标准库函数。或Boost的日历功能(不幸的是Boost中有太多的日历子库,至少有两个,但只选了一个)。

system返回命令的进程退出代码。为了获得命令的输出(如果有),您可以将其重定向到文件,然后可以随后打开和读取该文件。这对于Unix-land和Windows命令处理器来说是微不足道的,只需要命令中的>myfile.txt

或者,您可以设置管道并进行轮询。 C ++标准库不支持这一点,并且您不使用system来执行此操作。它避免了文件,它让你的程序处理来自连续运行的进程的输出,但是复杂性和系统依赖性会有成本。

同样,使用system获取当前日期是不合适的。

使用相关的直接标准库功能,仅使用system或标准库无法提供所需内容的其他方法。

¹ tmpnam功能&amp;家庭可能很有用。 功能