Действительно ли это возможно в суд к терминалу при перенаправлении суда к outfile?

Я запускаю программу и перенаправление cout к outfile, как так:

./program < infile.in > outfile.o  

Я хочу смочь читать в опции ('-h' или '-справка') из командной строки и произвести сообщение справки к терминалу. Есть ли способ, которым я могу сделать это, но все еще иметь постоянного клиента cout от остальной части программы переходят к outfile?

Был бы cout право быть объектом использовать для такой вещи?

5
задан meagar 11 March 2010 в 14:26
поделиться

6 ответов

Вы должны использовать 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 является более сложным, чем большинство людей думает, и часто все, кроме самой простой формы (">"), пропускается из виду.

15
ответ дан 18 December 2019 в 07:09
поделиться

~ $ cmd | Tee log_file до dup STDOUT к файлу и клемма и
~ $ CMD 2> log_file для печати stdout на терминал и ] STDERR в файл

2
ответ дан 18 December 2019 в 07:09
поделиться

Вы можете выводить справочное сообщение для STDERR. STDERR обычно используется для неравливого выхода, и вы можете рассмотреть абзац использования, чтобы быть таким выходом.

1
ответ дан 18 December 2019 в 07:09
поделиться

Если вы находитесь в 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

Обратите внимание на способ, которым с двумя потоками независимо, независимо от относительной упорядочения, если они выводят на одно и то же устройство, не обязательно сохраняется. Это может быть отрегулировано путем промывки потоков в соответствующие времена.

3
ответ дан 18 December 2019 в 07:09
поделиться

Одна из вещей, которые я сделал - не говорил, что это всегда уместно - это модули записи, которые имеют что-то вроде этой подписи.

void write_out(ostream &o);

И тогда я могу создавать объекты FStream и пропустить их или проходить в Cout и Cerr, что мне нужно в то время. Это может быть полезно в письменном виде кода ведения журнала, где иногда вы хотите увидеть на терминал, что происходит, и в другое время вы просто хотите логики.

Х-е.

1
ответ дан 18 December 2019 в 07:09
поделиться

Вы должны использовать cerr вместо cout. Использование перенаправления оболочки > только перенаправляет stdout (cout), а не stderr (cerr).

0
ответ дан 18 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: