Я запускаю программу и перенаправление cout
к outfile, как так:
./program < infile.in > outfile.o
Я хочу смочь читать в опции ('-h' или '-справка') из командной строки и произвести сообщение справки к терминалу. Есть ли способ, которым я могу сделать это, но все еще иметь постоянного клиента cout
от остальной части программы переходят к outfile?
Был бы cout
право быть объектом использовать для такой вещи?
Вы должны использовать cerr для вывода вашего справочного сообщения на STDERR, которое не включено в ваше перенаправление на outfile.o.
Given ./program < infile.in > outfile. o
:
cout << "This writes to STDOUT, and gets redirected to outfile.";
cerr << "This doesn't get redirected, and displays on screen.";
Если позднее вы захотите перенаправить и STDOUT, и STDERR, вы можете сделать
./program < infile.in &> outfile.o
Если вы хотите перенаправить только STDOUT, но разрешить STDOUT для отображения, использование
./program < infile.in 2> outfile.o
Bash redirection является более сложным, чем большинство людей думает, и часто все, кроме самой простой формы (">"), пропускается из виду.
~ $ cmd | Tee log_file
до dup STDOUT
к файлу и клемма и
~ $ CMD 2> log_file
для печати stdout
на терминал и ] STDERR
в файл
Вы можете выводить справочное сообщение для STDERR. STDERR обычно используется для неравливого выхода, и вы можете рассмотреть абзац использования, чтобы быть таким выходом.
Если вы находитесь в Linux Можно использовать псевдоустройство / dev / tty
, чтобы выводиться на управляющий терминал (если есть). Это будет работать, даже если STDERR
перенаправляется, а также Stdout
. Другие операционные системы могут предоставлять аналогичные механизмы.
E.g.
#include <iostream>
#include <ostream>
#include <fstream>
int main()
{
std::ofstream term("/dev/tty", std::ios_base::out);
term << "This goes to terminal\n";
std::cout << "This goes to stdout\n";
return 0;
}
будет работать так:
$ ./a.out This goes to stdout This goes to terminal $ ./a.out >/dev/null This goes to terminal
Обратите внимание на способ, которым с двумя потоками независимо, независимо от относительной упорядочения, если они выводят на одно и то же устройство, не обязательно сохраняется. Это может быть отрегулировано путем промывки потоков в соответствующие времена.
Одна из вещей, которые я сделал - не говорил, что это всегда уместно - это модули записи, которые имеют что-то вроде этой подписи.
void write_out(ostream &o);
И тогда я могу создавать объекты FStream и пропустить их или проходить в Cout и Cerr, что мне нужно в то время. Это может быть полезно в письменном виде кода ведения журнала, где иногда вы хотите увидеть на терминал, что происходит, и в другое время вы просто хотите логики.
Х-е.
Вы должны использовать cerr вместо cout. Использование перенаправления оболочки > только перенаправляет stdout (cout), а не stderr (cerr).