很抱歉,如果这是一个非常棒的问题,但我只是从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)中,日期也会自动打印在屏幕上,任何可能出错的想法?
答案 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;家庭可能很有用。
功能