Я использую симулятор (ndnSIM) в Linux, который основан на C++. Выполняя некоторые задачи, он печатает выходные данные в каждой секунде в stdout
помощью этой команды:
L3RateTracer::InstallAll ("-", Seconds (1));
, Это константа, и я не могу изменить ее формат, чтобы печатать выходные данные в строке или массиве. Я хочу извлечь определенные данные из этого вывода из stdout
. Например, вывод в 1-й секунде был напечатан в stdout
следующим образом (промежуток между каждой функцией - Tab):
1 C1 0 1 Out1 268 335 0
1 C1 0 2 Out2 0 0 0
1 C2 1 1 Out1 0 0 0
1 R3 1 1 Out2 317 0 0
1 P1 -1 all Sat1 268 0 335
1 C1 -1 all Tim1 0 0 0
1 R2 1 9 Out1 0 0 0
Мне нужно извлечь данные шестой колонки для тех выходов, которые являются "R3" в 2-м столбце и "Out2" в 5-м столбце. В этом примере желаемое значение равно "317".
Как я могу извлечь это значение (= 317) каждую секунду из печатного выхода в stdout
C++?
Вы не хотите использовать регулярное выражение для этого или что-нибудь еще, если вам это не нужно.
То, что вам нужно сделать, - это прочитать в файле, разделить его на вкладки и/или пробелы, я не могу сказать, а затем извлечь нужный элемент.
Читайте о том, как разбить строки здесь: Разделить строку в C++?
для чтения из stdin
, который, как вам кажется, вы хотите сделать, вам нужно сделать это:
std::string line;
std::getline(std::cin, line);
В сочетании со способом разделения строк выше, он будет работать чудесно. Затем вы сможете использовать ToolThatPrintsThings | YourNewTool
ToolThatPrintsThings | YourNewTool
std::getline(std::cin, line)
ожидает ввода моих данных в командной строке. Но мне нужно собирать данные из автоматически генерируемых данных в stdout
, а не ждать ввода данных человеком.
Использовать awk
:
ndnSIM | awk '{print $6}' | yourProg
Теперь yourProg
просто должен прочитать каждую строку cin::getline()
, которая будет столбцом 6 из вывода ndnSIM.
./waf --run=MyProg | awk '{print $6}' | cin::getline()
? Но я думаю, что я неправильно понял! Первый канал - команда запуска симулятора ndnSIM.
cin::getline()
- это то, что вы пишете в своей программе на C ++, чтобы прочитать строку из стандартного ввода. Это не команда оболочки.
C++
? Почему бы сначала не пропустить это черезawk
?C++
. я не знаком сawk
.