Предположим, у меня есть такой код
#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
и открыть это?
Вы всегда можете использовать стандартный поток ошибок например, Сообщения об ошибках.
#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 \ тест] > _
РЕДАКТИРОВАТЬ: добавлен цветной код и выделение жирным шрифтом.
Почему бы не использовать файловые потоки? таким образом, он, скорее всего, будет работать независимо от перенаправления оболочки:
#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();
Вы можете использовать cout и cerr.
cout << "Redirect to file1" << endl;
cerr << "Redirect to file2" << endl;
cerr идет к стандартной ошибке
Еще один способ сделать это с помощью 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;
}
Код:
#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