доступ к старому стандартному выводу после того, как он был freopen’d?

У меня есть куча командных файлов, которые делают что-то подобное с программой A:

A > log.txt ; grep 'result:' log.txt > result.txt || raise_hell.sh

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

  • вызывает _freopen («somefile», «w», stdout), а затем
  • вызывает printf (и его варианты) в миллионе мест и ожидает, что вывод закончится в некотором файле.

Для меня не очень практично менять каждый printf в проекте. Не практично менять каждый пакетный файл, поэтому я не знаю, куда перенаправляется мой вывод.

В идеале я хотел бы иметь какой-то способ добраться до «первоначального значения» стандартного вывода, и просто пиши туда. Но как? Я даже могу заменить вызов freopen чем-то другим, если вывод по-прежнему заканчивается там, где и должен.

Другими словами, я бы хотел, чтобы printf попал в файл и имел какой-то другой способ распечатать материал в стандартном формате.

Я попробовал несколько вещей, частично основанных на ответах на варианты этого вопроса. Тем не менее, ничего из этого не работает, потому что все они в конечном итоге пишут в какой-то файл. Помощь будет приветствоваться.

редактироватьПросто для ясности, это на Windows, с использованием Visual Studio 2010.

0

Решение

Хорошо, я не Windows-парень, но просто как ответ на конкретный вопрос: как бездельничать с stdout. В UNIX мы использовали бы dup / dup2, который в соответствии с:

http://www.suacommunity.com/dictionary/dup-entry.php

только немного отличается в окнах. Основная идея UNIX заключается в том, что stdout — это файловый дескриптор 1 … изменение того, что там открыто, эквивалентно его перенаправлению. Используя dup, вы можете сначала сделать его копию на тот случай, если захотите ее вернуть.

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

2

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

Других решений пока нет …

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