2017-01-26 3 views
0

Извините, если это очень пустой вопрос, но я только начинаю с ncurses (и C++).system() output in ncurses

Я пытаюсь вызвать системную команду внутри кода 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"); выполняется, дата автоматически печатается на экране, даже если я буду хранить его в переменной (например, в данном случае) , Любая идея о том, что может быть неправильным?

+0

Возможно, обман: [Как выполнить команду и получить вывод команды в C++ с помощью POSIX?] (Http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get -output-of-command-in-c-using-posix) – user4581301

+0

Возможный дубликат [Как выполнить команду и получить вывод команды в C++ с помощью POSIX?] (http://stackoverflow.com/questions/478898/how -to-execute-a-command-and-get-output-of-command-in-c-using-posix) –

ответ

2

popen() функция может быть использована для выполнения команды и прочитать его выход программно.

+0

Отлично, вот что я искал. – Ghost

1

Вы не храните переменную. Функция std :: system() возвращает значение завершения команды, которую вы выполнили, а не текст, который (если есть), команда будет писать на стандартный вывод. Использование std :: system() неприемлемо в любом серьезном коде C или C++ - лично я хотел бы, чтобы он был устаревшим на обоих языках.

+1

Приятно видеть вас, Нил.Но re "Использование std :: system() неприемлемо в любом серьезном коде C или C++", в то время как это зависит от определения "серьезного", например, защиты Билла Клинтона, что истина или нет его утверждения зависит от определения слова «есть», это, как правило, необоснованный необоснованный мему. Это выражается во многих ответах здесь, на SO, но это просто битки. 'system' обеспечивает ценную, хотя и немного ограниченную, услугу. –

+0

* Использование std :: system() неприемлемо в каких-либо серьезных C или C++-кодексах * ерунда. Ерунда. Существует множество веских причин использовать 'system()': использование сторонней утилиты недоступно в противном случае, а простое разделение дочернего процесса - всего два. –

+0

@Alf Я не вижу, как это может быть ценно. Вы не можете захватить вывод команды, она зависнет ваше приложение до его завершения (если оно есть), оно не выдает никаких сообщений об ошибках диагностики, отличных от возвращаемого значения, и т. Д. И т. Д. Я никогда не использовал его в любой программе, которую я имею и я не могу себе представить, как хорошо написанный код мог бы его использовать. Но, возможно, вы можете опубликовать пример того, что делает. –

1

Прежде всего, обратите внимание, что команды, которые вы используете с system, а также их эффекты и вывод, обязательно зависят от системы. Чтобы получить текущую дату, вам намного лучше использовать соответствующие стандартные функции библиотеки для этого. Или функциональность календаря от Boost (к сожалению, в Boost имеется слишком много вспомогательных библиотек календарей, по крайней мере два, но просто выберите один).

system возвращает код выхода процесса команды. Чтобы получить выход команды, если таковой имеется, вы можете перенаправить его в файл, который затем затем можно открыть и прочитать. Это тривиально делать с командами процессоров Unix-land и Windows, ≈ просто >myfile.txt в команде.

В качестве альтернативы вы можете настроить трубку и опросить ее. Это не поддерживается стандартной библиотекой C++, и вы не используете system для этого. Он избегает файла, и он позволяет вашей программе обрабатывать выходные данные из непрерывного процесса, но есть затраты по сложности и системным зависимостям.

Опять же, использование system для получения текущей даты является неуместным.

Используйте соответствующие функции библиотеки прямого стандарта, используйте только system или другие средства, где стандартная библиотека не предоставляет то, что вам нужно.


¹ tmpnam функция & семья может быть полезным.