Можно ли выполнить cout на терминал, перенаправляя cout на outfile - PullRequest
5 голосов
/ 28 января 2010

Я запускаю программу и перенаправляю cout в выходной файл, например:

./program < infile.in > outfile.o  

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

Будет ли cout подходящим объектом для такой вещи?

Ответы [ 6 ]

15 голосов
/ 28 января 2010

Вы должны использовать cerr для вывода вашего справочного сообщения в STDERR, которое не включено в ваше перенаправление на outfile.o.

Дано ./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

Если вы хотите перенаправить только STDERR, но разрешить отображение STDOUT, используйте

./program < infile.in 2> outfile.o

Перенаправление Bash является более сложным, чем думает большинство людей, и часто все, кроме самой простой формы (">"), упускается из виду.

3 голосов
/ 28 января 2010

Если вы используете Linux, вы можете использовать псевдоустройство /dev/tty для вывода на управляющий терминал (если есть). Это будет работать, даже если stderr перенаправлен так же, как и stdout. Другие операционные системы могут предоставлять аналогичные механизмы.

* 1006 Е.Г. *

#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

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

2 голосов
/ 28 января 2010

~$ cmd | tee log_file для копирования stdout в файл и терминал
~$ cmd 2>log_file для печати stdout на терминал и stderr в файл

1 голос
/ 28 января 2010

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

void write_out(ostream &o);

И тогда я могу создавать объекты fstream и передавать их или передавать cout и cerr, все, что мне нужно в это время. Это может быть полезно при написании кода регистрации, когда иногда вы хотите видеть, что происходит на терминале, а в других случаях вам просто нужен файл журнала.

НТН.

1 голос
/ 28 января 2010

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

0 голосов
/ 28 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...