ncurses 中的 system() 输出
system() output in 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),知道哪里出了问题吗?
您没有存储在变量中。 std::system() 函数 returns 您执行的命令的退出值,而不是命令将写入标准输出的文本(如果有的话)。在任何严肃的 C 或 C++ 代码中使用 std::system() 都是不合适的——我个人希望看到它在两种语言中都被弃用。
首先,请注意您与 system
一起使用的命令及其效果和输出必须依赖于系统。要获得当前日期,最好使用相关的标准库函数。或者来自Boost的日历功能(不幸的是Boost中的日历子库太多了,至少有两个,但只能选择一个)。
system
returns 命令的进程退出代码。为了获得命令的输出(如果有),您可以将其重定向到一个文件,随后您可以打开并阅读该文件。这对于 Unix-land 和 Windows 命令处理器来说是微不足道的,只需 >myfile.txt
命令中的
或者,您可以设置管道并对其进行轮询。这不受 C++ 标准库的支持,并且您不使用 system
来执行此操作。它避免了文件,并让您的程序处理来自连续 运行 进程的输出,但在复杂性和系统依赖性方面存在成本。
同样,使用system
获取当前日期是不合适的。
使用相关的直接标准库功能,仅使用system
或标准库未提供您需要的其他方式。
¹ tmpnam
函数和系列可能很有用。
popen()
函数可用于执行命令并以编程方式读取其输出。
抱歉,如果这是一个非常菜鸟的问题,但我只是从 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),知道哪里出了问题吗?
您没有存储在变量中。 std::system() 函数 returns 您执行的命令的退出值,而不是命令将写入标准输出的文本(如果有的话)。在任何严肃的 C 或 C++ 代码中使用 std::system() 都是不合适的——我个人希望看到它在两种语言中都被弃用。
首先,请注意您与 system
一起使用的命令及其效果和输出必须依赖于系统。要获得当前日期,最好使用相关的标准库函数。或者来自Boost的日历功能(不幸的是Boost中的日历子库太多了,至少有两个,但只能选择一个)。
system
returns 命令的进程退出代码。为了获得命令的输出(如果有),您可以将其重定向到一个文件,随后您可以打开并阅读该文件。这对于 Unix-land 和 Windows 命令处理器来说是微不足道的,只需 >myfile.txt
命令中的
或者,您可以设置管道并对其进行轮询。这不受 C++ 标准库的支持,并且您不使用 system
来执行此操作。它避免了文件,并让您的程序处理来自连续 运行 进程的输出,但在复杂性和系统依赖性方面存在成本。
同样,使用system
获取当前日期是不合适的。
使用相关的直接标准库功能,仅使用system
或标准库未提供您需要的其他方式。
¹ tmpnam
函数和系列可能很有用。
popen()
函数可用于执行命令并以编程方式读取其输出。