Разделение вывода в C / C ++ для перенаправления

Предположим, у меня есть такой код

#include <iostream>
using namespace std;

int main() {
cout << "Redirect to file1" << endl;
cout << "Redirect to file2" << endl;
return 0;
}

Я хочу перенаправить первый вывод в файл1, а второй в файл2. Это возможно?

Я думаю, в C, fclose(stdout) и открыть stdout может помочь, но я не уверен, как открыть его снова или он работает.

Спасибо

ОБНОВЛЕНИЕ: для чего?

У меня есть программа A, которая читает ввод от пользователя и генерирует соответствующий вывод. Теперь я хочу проверить, правильно ли это, у меня есть программа B, которая генерирует ввод для A, а также корректный вывод. B будет генерировать один набор тестовых данных за раз. И у меня будут тысячи тестов.

На моей машине тысячу раз ./B > ``mktemp a.XXX`` работает лучше, чем при использовании ofstream, С помощью fstream тысячи раз мой жесткий диск мигает безумно. Но не при перенаправлении во временный файл.

UPDATE2:

В C ++ кажется, что преобладающим ответом является cout вместе с cerr,

Как насчет C, кроме stderrмогу ли я закрыть stdout и открыть это?

2

Решение

Вы всегда можете использовать стандартный поток ошибок например, Сообщения об ошибках.

#include <iostream>
using namespace std;

int main() {
cout << "Redirect to file1" << endl;
cerr << "Redirect to file2" << endl;
}

Например, используя интерпретатор команд Windows [cmd.exe] и Visual C ++ cl компилятор:

[D: \ DEV \ тест]
> тип кон >streams.cpp
#включают <iostream>
использование пространства имен std;

int main () {
    соиЬ << «Перенаправить в файл1» << епсИ;
    сегг << "Перенаправить в файл2" << епсИ;
}
^ Z

[D: \ DEV \ тест]
> cl streams.cpp
streams.cpp

[D: \ DEV \ тест]
> потоки 1>текст 2>b.txt

[D: \ DEV \ тест]
> введите a.txt
Перенаправить в файл1

[D: \ DEV \ тест]
> введите b.txt
Перенаправить в файл2

[D: \ DEV \ тест]
> _

РЕДАКТИРОВАТЬ: добавлен цветной код и выделение жирным шрифтом.

1

Другие решения

Почему бы не использовать файловые потоки? таким образом, он, скорее всего, будет работать независимо от перенаправления оболочки:

#include <fstream>
#include <fstream>
using namespace std;
// opeen files
ofstream file1 ( "file1");
ofstream file2 ( "file2");
//write
file1 << "Redirect to file1" << endl;
file2 << "Redirect to file2" << endl;
//close files
file1.close();
file2.close();
3

Вы можете использовать cout и cerr.

cout << "Redirect to file1" << endl;
cerr << "Redirect to file2" << endl;

cerr идет к стандартной ошибке

2

Еще один способ сделать это с помощью cout.rdbuf() как это:

#include <iostream>
#include <fstream>
using namespace std;

int main () {
ofstream cfile1("test1.txt");
ofstream cfile2("test2.txt");

cout.rdbuf(cfile1.rdbuf());
cout << "Redirect to file1" << endl;

cout.rdbuf(cfile2.rdbuf());
cout << "Redirect to file2" << endl;

return 0;
}
1

Код:

#include <iostream>
using namespace std;

int main() {
cout << "Redirect to file1" << endl;
cerr << "Redirect to file2" << endl;
return 0;
}

Приставка:

test > 1.txt 2> 2.txt

1.txt:

Redirect to file1

2.txt:

Redirect to file2
1
По вопросам рекламы [email protected]